📄 comm.cpp
字号:
#include "stdafx.h"
#include "comm.h"
CRS232::CRS232()
{
m_pCallBackFunc=NULL;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
memset(&m_osRead, 0,sizeof(OVERLAPPED));
m_bConnected=FALSE;
m_pThread=NULL;
m_hThreadTerm=CreateEvent(NULL,FALSE,FALSE,NULL);
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
}
CRS232::~CRS232()
{
if(m_bConnected)
CloseConnection();
CloseHandle(m_hThreadTerm);
CloseHandle(m_osRead.hEvent);
CloseHandle(m_osWrite.hEvent);
}
int CRS232::OpenConnect(LPCTSTR szComPort,DWORD dwBaudRate,BYTE cByteSize,BYTE cStopBit,BYTE cParity)
{
COMMTIMEOUTS CommTimeOuts ;
if(m_bConnected)
return 0;
SetEvent(m_osWrite.hEvent);
m_hComDev=CreateFile(szComPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(m_hComDev==INVALID_HANDLE_VALUE)
return -1;//e_OpenComm;
DCB dcb;
dcb.DCBlength =sizeof(DCB);
GetCommState(m_hComDev,&dcb);
dcb.BaudRate = dwBaudRate;
dcb.ByteSize = cByteSize;
dcb.Parity = cParity;
dcb.StopBits = cStopBit;
if(SetCommState(m_hComDev,&dcb)){
SetCommMask(m_hComDev,EV_RXCHAR);
SetupComm(m_hComDev,RXQUEUE,TXQUEUE);
PurgeComm( m_hComDev, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
CommTimeOuts.ReadIntervalTimeout = MAXDWORD ;
CommTimeOuts.ReadTotalTimeoutMultiplier = MAXDWORD;
CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
CommTimeOuts.WriteTotalTimeoutMultiplier = MAXDWORD;
CommTimeOuts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts( m_hComDev, &CommTimeOuts ) ;
m_bConnected=TRUE;
if(m_pThread=AfxBeginThread(CommWatchThreadProc,(LPVOID)this)){
EscapeCommFunction(m_hComDev,SETDTR);
return 0;
}
}
m_bConnected=FALSE;
CloseHandle(m_hComDev);
return -2;//e_InitializeComm;
}
UINT CRS232::CommWatchThreadProc(LPVOID pParam)
{
CRS232 *pRS232=(CRS232 *)pParam;
DWORD dwEvtMask;
HANDLE aEvent[2];
OVERLAPPED os;
int nLength;
char abIn[MAXBLOCK+1];
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
aEvent[0]=os.hEvent;
aEvent[1]=pRS232->m_hThreadTerm;
while(pRS232->m_bConnected){
WaitCommEvent(pRS232->m_hComDev,&dwEvtMask,&os);
if(WaitForMultipleObjects(2,aEvent,FALSE,INFINITE)==WAIT_OBJECT_0){
if((dwEvtMask &EV_RXCHAR)==EV_RXCHAR)
do{
if((nLength=pRS232->ReadCommBlock(abIn,MAXBLOCK))&&pRS232->m_pCallBackFunc){
abIn[nLength]=0;
(*pRS232->m_pCallBackFunc)(abIn,nLength,pRS232->m_pCallBackParam);
}
}while(nLength>0);
}
}
CloseHandle(os.hEvent);
return 0;
}
int CRS232::ReadCommBlock(LPSTR lpszBlock,int nMaxLength)
{
COMSTAT ComStat;
DWORD dwLength,dwErrorFlags;
ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
dwLength=min((DWORD)nMaxLength,ComStat.cbInQue);
if(dwLength>0){
if(!ReadFile(m_hComDev,lpszBlock,dwLength,&dwLength,&m_osRead))
if(GetLastError()==ERROR_IO_PENDING)
if(!GetOverlappedResult(m_hComDev,&m_osRead,&dwLength,TRUE))
ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
return dwLength;
}
return 0;
}
BOOL CRS232::CloseConnection()
{
if(!m_bConnected)
return FALSE;
SetEvent(m_hThreadTerm);
m_bConnected=FALSE;
SetCommMask(m_hComDev,0);
WaitForSingleObject(m_pThread->m_hThread,INFINITE);
//EscapeCommFunction(m_hComDev,CLRDTR);
CloseHandle(m_hComDev);
return TRUE;
}
void WINAPI MyRS232CallBackFunc(LPCTSTR szDataBuf,int nDataLen,LPVOID pParam)
{
for(int i=0;i<nDataLen;i++)
{
printf("%d\t",nDataLen);
printf("%02x\t",szDataBuf[i]);
}
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -