串口通信模块5:串口操作自定义类(3)
生活随笔
收集整理的這篇文章主要介紹了
串口通信模块5:串口操作自定义类(3)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在上述代碼基礎之上,本頁主要討論串口數據的接受、發送以及與窗口類函數的通信。
1.讀取串口數據函數的實現
//接收串口數據 void CMySerial::ReceiveChar(CMySerial* port, COMSTAT comstat) {BOOL bRead = TRUE;BOOL bResult = TRUE;DWORD dwError = 0;DWORD BytesRead = 0;unsigned char RXBuff;//讀取串口數居for (; ;){ /判斷當前串口緩沖中是否已無數據可讀?如果是則直接退出循環EnterCriticalSection( & port->m_csCommunicationSync);bResult = ClearCommError(port->m_hComm, &dwError, &comstat);LeaveCriticalSection( & port->m_csCommunicationSync);if (comstat.cbInQue == 0) //無任何數據可讀{break;}//鎖定臨界資源EnterCriticalSection(&port->m_csCommunicationSync);if (bRead) {bResult = ReadFile(port->m_hComm, //串口句柄&RXBuff, //存放數據緩沖1, //只讀一個字節&BytesRead, //實際讀取的數據數量&port->m_ov); //overlapped結構體if (!bResult){//讀取失敗switch (dwError == GetLastError()){case ERROR_IO_PENDING:{//數據尚未讀完bResult = FALSE;break;}default:{//一般錯誤處理方法port->ProcessErrorMessage("ReadFile()");break;}}}else{//讀取數據成功bResult = TRUE;}}if (!bRead){//讀取失敗處理bRead = TRUE;bResult = GetOverlappedResult(port->m_hComm, //串口句柄&port->m_ov, //overlapped結構體&BytesRead, //讀取的字節數TRUE); //等待if (!bResult)<span style="white-space:pre"> </span>{//錯誤處理<span style="white-space:pre"> </span>port->ProcessErrorMessage("GetOverlappedResults() in ReadFile()");<span style="white-space:pre"> </span>}}LeaveCriticalSection(&port->m_csCommunicationSync);//釋放臨界資源//向主窗口發送消息::SendMessage((port->m_pParent)->m_hWnd,WM_COMMNOTIFY,(WPARAM)RXBuff,(LPARAM)port->m_nPortNr);} }設計思想: 1.判斷當前串口緩沖中是否已無數據可讀,如果是那么可以直接退出循環; 2.從串口中讀取1個字節數據,并判斷是否讀取失敗?如果讀取失敗,判斷數據讀取失敗的原因。在進行深入判斷,讀取動作是否完成?如果完成就退出錯誤診斷!如果連數據讀取動作都沒有完成,那就有問題了?!需要進行錯誤提示。 3.既然數據讀取動作都沒有完成???那我們就必須提供防御代碼,就是進行持續性的等待,直到數據讀取動作完成。在此過程中,一旦等待過程發生了錯誤,我們必須提示這種錯誤! 4.向主窗口發送消息,通知主窗體串口接收到數據,并把剛剛讀取到的一個字節數據發送給主窗體。
2.寫串口函數的實現
<span style="font-size:18px;">//向串口輸出數據 void CMySerial::WriteChar(CMySerial* port) {BOOL bWrite = TRUE;BOOL bResult = TRUE;DWORD BytesSent = 0;ResetEvent(port->m_hWriteEvent);//鎖定臨界資源EnterCriticalSection(&port->m_csCommunicationSync);if (bWrite){port->m_ov.Offset = 0;port->m_ov.OffsetHigh = 0;//清空串口緩沖PurgeComm(port->m_hComm, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR);bResult = WriteFile(port->m_hComm,port->m_szWriteBuffer,strlen((char*)port->m_szWriteBuffer),& BytesSent,&port->m_ov);if (!bResult){//寫串口失敗DWORD dwError = GetLastError();switch (dwError){case ERROR_IO_PENDING:{//尚未寫完數據BytesSent = 0;bWrite = FALSE;break;}default:{//進行錯誤信息提示port->ProcessErrorMessage("WriteFile()");}}}else{//寫串口成功,解鎖臨界資源LeaveCriticalSection(&port->m_csCommunicationSync);}}if (!bWrite){//防錯bWrite = TRUE;//等待寫操作完成bResult = GetOverlappedResult(port->m_hComm, &port->m_ov, &BytesSent, TRUE);LeaveCriticalSection(& port->m_csCommunicationSync);if (!bResult){port->ProcessErrorMessage("GetOveralappedResult() in WriteFile()");}}//發送失敗if (BytesSent != port->m_nWriteSize){TRACE("WARNIGN:WriteFile() error.. BytesSent: %d; MessageLength: %d\n",BytesSent,strlen((char*)port->m_szWriteBuffer) );} }</span>3.數據發送函數的實現
該函數負責向串口類傳遞將要發送的數據,并把發送數據事件置為“允許”。 void CMySerial::WriteToPort(char* string, int n) {assert(m_hComm != 0);memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));memcpy(m_szWriteBuffer, string, n); //保存將要發送的數據m_nWriteSize = n; //發送數據的字節數SetEvent(m_hWriteEvent); //置發送數據事件為“允許”狀態 }總結
以上是生活随笔為你收集整理的串口通信模块5:串口操作自定义类(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 便利的视频会议
- 下一篇: 35天 GRE: V160+Q168+W