SerialPort類
WriteComm 寫串口函數
DWORD CSerialPort::WriteComm(char *buf, DWORD dwLength) { if(!IsOpen()) { return 0; } assert(buf != NULL); COMSTAT comStat; DWORD dwErrorFlags; if (!ClearCommError(m_hCom, &dwErrorFlags, &comStat) && dwErrorFlags > 0) { PurgeComm(m_hCom, PURGE_TXABORT | PURGE_TXCLEAR); } OVERLAPPED osWrite; memset(&osWrite, 0, sizeof(OVERLAPPED)); osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); BOOL bWriteStat = WriteFile(m_hCom, buf, dwLength, &dwLength, &osWrite); if(!bWriteStat) { if(GetLastError() == ERROR_IO_PENDING) { WaitForSingleObject(osWrite.hEvent, 2000); } else { dwLength = 0; } } return dwLength; }
調用
char buf[10]; //字符數組 將字符串通過 strcpy 放入字符數組再向串口寫入 strcpy(buf,"1234"); m_SerialPort.WriteComm(buf,4); MessageBox(_T("1234")); buf[0]=0x61; //將要發送的字符串或十六進制數據儲存在char型字符數組中,利用WriteComm發送到串口 m_SerialPort.WriteComm(buf,1);
ReadComm
DWORD CSerialPort::ReadComm(char *buf, DWORD dwLength) { if(!IsOpen()) { return 0; } buf[0] = '\0'; COMSTAT comStat; DWORD dwErrorFlags; if (!ClearCommError(m_hCom, &dwErrorFlags, &comStat) && dwErrorFlags > 0) { PurgeComm(m_hCom, PURGE_RXABORT | PURGE_RXCLEAR); return 0; } if(comStat.cbInQue == 0) { return 0; } DWORD dwBytesRead=0; BOOL bReadStat; dwBytesRead = min(dwLength - 1, (DWORD)comStat.cbInQue); OVERLAPPED osRead; memset(&osRead,0,sizeof(OVERLAPPED)); osRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); DWORD dwByteOfRead = 0; bReadStat = ReadFile(m_hCom, buf, dwBytesRead, &dwByteOfRead, &osRead); if(!bReadStat) { if(GetLastError() == ERROR_IO_PENDING) { WaitForSingleObject(osRead.hEvent, 2000); // GetOverlappedResult(m_hCom, &osRead, &dwByteOfRead, FALSE) ; } } // PurgeComm(m_hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ////清空串口的接收緩沖區,必要性不大,但有保證作用?清空的話如果大數據會丟失 buf[dwByteOfRead] = '\0'; return dwByteOfRead; }
調用
char *pBuf=new char[10]; //定義一個char型字符數組,動態分配內存 memset(pBuf,0,10); m_SerialPort.ReadComm(pBuf,10);