* CommUtils.h */
#ifndef _CommUtils_H__
#define _CommUtils_H__
class CommUtils
{
public:
bool ReadCom(unsigned char * ReceiveData, DWORD& ReceiveLength);
void CloseCom();
bool WriteCom(unsigned char * sendchar,int sendsize);
bool OpenCom(int Port);
CommUtils();
virtual ~CommUtils();
int m_Port;
char szCurPath[256];
private:
OVERLAPPED ReadovReady, WriteovReady;
HANDLE hComm;
bool bOpenCom;
};
#endif
|
一个串口通讯的类/* CommUtils.h */ #ifndef _CommUtils_H__ #define _CommUtils_H__ class CommUtils { public: bool ReadCom(unsigned char * ReceiveData, DWORD& ReceiveLength); void CloseCom(); bool WriteCom(unsigned char * sendchar,int sendsize); bool OpenCom(int Port); CommUtils(); virtual ~CommUtils(); int m_Port; char szCurPath[256]; private: OVERLAPPED ReadovReady, WriteovReady; HANDLE hComm; bool bOpenCom; }; #endif /* CommUtils.cpp 串口通讯类 Author: edog 2007-11-21 EMail: comwell@126.com */ #include "stdafx.h" #include "CommUtils.h" #include "stdio.h" const int READ_TIMEOUT = 500; CommUtils::CommUtils() { bOpenCom = false; } CommUtils::~CommUtils() { this->CloseCom(); } bool CommUtils::OpenCom(int Port) { if (bOpenCom) { this->CloseCom(); bOpenCom = false; } char szport[10]; sprintf(szport,"COM%d",Port); hComm = CreateFile( szport, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, //FILE_ATTRIBUTE_NORMAL| NULL); if (hComm == INVALID_HANDLE_VALUE) return false; if (!SetupComm(hComm, 1024, 512)) return false; COMMTIMEOUTS commtimeouts; commtimeouts.ReadIntervalTimeout = MAXDWORD; commtimeouts.ReadTotalTimeoutConstant =0; commtimeouts.ReadTotalTimeoutMultiplier =0; commtimeouts.WriteTotalTimeoutConstant =0; commtimeouts.WriteTotalTimeoutMultiplier=0; if (!SetCommTimeouts(hComm, &commtimeouts)) return false; memset(&ReadovReady,0,sizeof(OVERLAPPED)); memset(&WriteovReady,0,sizeof(OVERLAPPED)); ReadovReady.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); WriteovReady.hEvent =CreateEvent(NULL,TRUE,FALSE,NULL); SECURITY_ATTRIBUTES sa; sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor=NULL; sa.bInheritHandle=TRUE; DCB dcb; GetCommState(hComm, &dcb); dcb.fBinary = TRUE; dcb.fParity = TRUE; dcb.BaudRate = CBR_9600; // 波特率 9600 dcb.ByteSize = 8; // 8 位数据位 dcb.Parity = NOPARITY; // 无奇偶校验 dcb.StopBits = ONESTOPBIT; // 1 个停止位 if (!SetCommState(hComm, &dcb )) return false; bOpenCom = true; return bOpenCom; } bool CommUtils::WriteCom(unsigned char *sendchar, int sendsize) { if (!bOpenCom) return false; DWORD BytesSent; DWORD resD; PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); BytesSent=0; BOOL hr = WriteFile(hComm, // Handle to COMM Port sendchar, // Pointer to message buffer in calling finction sendsize, // Length of message to send &BytesSent, // Where to store the number of bytes sent &WriteovReady); // Overlapped structure if(!hr) { if(GetLastError() != ERROR_IO_PENDING) { return false; } else { resD=WaitForSingleObject(WriteovReady.hEvent,INFINITE); } switch(resD) { case WAIT_OBJECT_0: { if(!GetOverlappedResult(hComm,&WriteovReady,&BytesSent,false)) return false; else return true; } default: return false; break; } } return true; } void CommUtils::CloseCom() { if (!bOpenCom) return; CloseHandle(hComm); hComm=NULL; CloseHandle(ReadovReady.hEvent); CloseHandle(WriteovReady.hEvent ); ReadovReady.hEvent =NULL; WriteovReady.hEvent =NULL; } bool CommUtils::ReadCom(unsigned char * ReceiveData, DWORD& ReceiveLength) { if (!bOpenCom) return false; if (ReadovReady.hEvent == NULL) return false; ReceiveLength = 0; if (ReadFile(hComm, ReceiveData, 128, &ReceiveLength, &ReadovReady) == FALSE) { if (GetLastError() != ERROR_IO_PENDING) return false; } if(ReceiveLength == 0) return false; ReceiveData[ReceiveLength] = 0; DWORD dwRead; DWORD dwRes = WaitForSingleObject(ReadovReady.hEvent, READ_TIMEOUT); switch(dwRes) { case WAIT_OBJECT_0: if (!GetOverlappedResult(hComm, &ReadovReady, &dwRead, FALSE)) return false; break; case WAIT_TIMEOUT: break; default: break; } return true; } #include "CommUtils.h" CommUtils theComm; unsigned char data[1024]; unsigned long len = 0; // 2. 打开串口,设置接收定时器 theComm.OpenCom(1); // 打开COM1口 SetTimer(1, 50, 0); // 3. 发送数据 theComm.WriteCom(data, len); // 4. 接收数据处理 void CUARTDlg::OnTimer(UINT nIDEvent) { if (nIDEvent == 1) { if (theComm.ReadCom(data, len)) { if (len > 0) { // 接收数据处理。。。 } } } CDialog::OnTimer(nIDEvent); } |
嘟嘟互动视觉网站是多点触控、虚拟现实、增强现实、大屏幕投影显示等技术的交流学习网站网站