?? serialport.cpp
字號:
SerialPort::SerialPort()
{
memset(&mstcCycBufSpRecv,0,sizeof(mstcCycBufSpRecv));
mstcCycBufSpRecv.iBufSize=CPSP_MAXBUFSIZE_RECV;
//
mhCom=INVALID_HANDLE_VALUE;
//
mbRcvEnable=FALSE;
mhEvtThdCpSpRecv=NULL;
//
mpucBufRecv=NULL;
mdwWaitRecvRslt=WAIT_OBJECT_0;
mdwRecvLen=0;
}
SerialPort::~SerialPort()
{
}
//
BOOL SerialPort::Open(LPCTSTR lpstrName, DWORD dwBaudRate, UCHAR ucDataBits, UCHAR ucStopBits, UCHAR ucParity, DWORD dwRdIntervTmout, DWORD dwBufSize)
{
DCB stcDcbCom;
COMMTIMEOUTS stcTmout;
mhCom=CreateFile(lpstrName,GENERIC_READ|GENERIC_WRITE,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if (mhCom==INVALID_HANDLE_VALUE)
return FALSE;
GetCommState(mhCom,&stcDcbCom);
stcDcbCom.BaudRate =dwBaudRate;
stcDcbCom.ByteSize =ucDataBits;
stcDcbCom.StopBits =ucStopBits;
stcDcbCom.Parity =ucParity;
stcDcbCom.fBinary =TRUE;
stcDcbCom.fParity =TRUE;
stcDcbCom.fOutX =FALSE;
stcDcbCom.fInX =FALSE;
stcDcbCom.ErrorChar=63;
SetCommState(mhCom,&stcDcbCom);
SetupComm(mhCom,dwBufSize,dwBufSize); //指定串口的內部輸入/輸出緩沖區的大小
stcTmout.ReadIntervalTimeout =dwRdIntervTmout;
stcTmout.ReadTotalTimeoutMultiplier =0;
stcTmout.ReadTotalTimeoutConstant =0;
stcTmout.WriteTotalTimeoutMultiplier=0;
stcTmout.WriteTotalTimeoutConstant =0;
SetCommTimeouts(mhCom,&stcTmout);
return TRUE;
}
//
void SerialPort::Close()
{
//停止串口接收線程
mbRcvEnable=FALSE;
if (mhEvtThdCpSpRecv!=NULL)
{
WaitForSingleObject(mhEvtThdCpSpRecv,INFINITE);
CloseHandle(mhEvtThdCpSpRecv);
mhEvtThdCpSpRecv=NULL;
}
//
if (mstcOvLpRecv.hEvent!=NULL)
{
CloseHandle(mstcOvLpRecv.hEvent);
mstcOvLpRecv.hEvent=NULL;
}
//關閉串口
if (IsOpen())
CloseHandle(mhCom);
mhCom=INVALID_HANDLE_VALUE;
}
//
BOOL SerialPort::StartReceive()
{
//賦值串口接收OVERLAPPED結構
memset(&mstcOvLpRecv,0,sizeof(mstcOvLpRecv));
if ( (mstcOvLpRecv.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL )
return FALSE;
//啟動串口接收線程
if ( (mhEvtThdCpSpRecv=CreateEvent(NULL,FALSE,FALSE,NULL))==NULL )
return FALSE;
mbRcvEnable=TRUE;
AfxBeginThread(ThdCpSpReceiving,(LPVOID)this); //啟動接收線程
return TRUE;
}
//
BOOL SerialPort::Send(UCHAR ucarrBuf[], DWORD dwSndLn, LPDWORD pdwSndLnAct)
{
OVERLAPPED stcOverLapped;
DWORD dwSndLnAct;
memset(&stcOverLapped,0,sizeof(stcOverLapped));
if ( (stcOverLapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL )
return FALSE;
WriteFile(mhCom,ucarrBuf,dwSndLn,&dwSndLnAct,&stcOverLapped);
GetOverlappedResult(mhCom,&stcOverLapped,&dwSndLnAct,TRUE);
if (pdwSndLnAct!=NULL)
*pdwSndLnAct=dwSndLnAct;
return TRUE;
}
//
BOOL SerialPort::Receive(UCHAR ucarrBuf[], DWORD dwRcvLn, LPDWORD pdwRcvLnAct)
{
DWORD dwRcvLnAct;
BOOL bRetVal;
DWORD dwCnt;
dwRcvLnAct=0;
bRetVal=FALSE;
if (mdwWaitRecvRslt==WAIT_OBJECT_0)
{
mpucBufRecv=new UCHAR[dwRcvLn+1];
memset(mpucBufRecv,0,sizeof(*mpucBufRecv)*(dwRcvLn+1));
ReadFile(mhCom,mpucBufRecv,dwRcvLn,&dwRcvLnAct,&mstcOvLpRecv);
}
mdwWaitRecvRslt=WaitForSingleObject(mstcOvLpRecv.hEvent,0);
if (mdwWaitRecvRslt==WAIT_OBJECT_0)
{
GetOverlappedResult(mhCom,&mstcOvLpRecv,&dwRcvLnAct,FALSE);
if (dwRcvLnAct>0) //讀到數據
{
for (dwCnt=0;dwCnt<dwRcvLnAct;dwCnt++)
ucarrBuf[dwCnt]=mpucBufRecv[dwCnt];
delete mpucBufRecv;
mpucBufRecv=NULL;
bRetVal=TRUE;
}
}
if (pdwRcvLnAct!=NULL)
*pdwRcvLnAct=dwRcvLnAct;
return bRetVal;
}
//
BOOL SerialPort::IsOpen()
{
if(mhCom==INVALID_HANDLE_VALUE)
return FALSE;
else
return TRUE;
}
//用戶定義函數
//串口接收線程
UINT ThdCpSpReceiving(LPVOID pParam)
{
SerialPort* pclsSp;
UCHAR ucarrBufSp[2]; //串口接收緩沖區
pclsSp=(SerialPort*)pParam;
while (pclsSp->mbRcvEnable)
{
if ( pclsSp->Receive(ucarrBufSp,1) )
{
pclsSp->mstcCycBufSpRecv.ucarrBuf[pclsSp->mstcCycBufSpRecv.iWrtPt]=ucarrBufSp[0];
pclsSp->mstcCycBufSpRecv.iWrtPt=(pclsSp->mstcCycBufSpRecv.iWrtPt+1)
% pclsSp->mstcCycBufSpRecv.iBufSize;
}
else
Sleep(1);
}
//give sem
SetEvent(pclsSp->mhEvtThdCpSpRecv);
AfxEndThread(0);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -