解決CserialPort類串口程序中WriteToPort只能發送一次問題


現象:每次打開串口只能發送一次,需要關閉再打開或者接收完數據才能發送
成因:在自帶串口的電腦、或用優質的USB串口線都沒有出現改問題,很有可能跟串口線的質量有關,
調試發現在調用玩WriteToPort函數 SetEvent(m_hWriteEvent);後第一次能夠正常進入監視線程(CommThread(LPVOID pParam))
調用WriteChar(port),然之後,一直進入ReceiveChar(port, comstat),再次發送SetEvent(m_hWriteEvent)也無法去到WriteChar(port)。

分析:某種原因導致一直存在串口接收消息,而(WaitForMultipleObjects)函數在等待事件具有優先級判斷,InitPort()函數中
m_hEventArray[1] = m_ov.hEvent; m_hEventArray[2] = m_hWriteEvent;m_ov.hEvent事件(包含接收事件),寫串口事件m_hWriteEvent;優先級更高
所以在出現一直存在接收事件時,無法發送數據;

Event = WaitForMultipleObjects(3,port->m_hEventArray,FALSE,INFINITE);

解決:
解決的思路是將寫串口事件(m_hWriteEvent)的優先級高於接收事件(m_ov.hEvent),如下:

修改
BOOL CSerialPort::InitPort(......){
......
m_hEventArray[0] = m_hShutdownEvent; // highest priority
m_hEventArray[1] = m_hWriteEvent;
m_hEventArray[2] = m_ov.hEvent;
......
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章