多線程CSerialPort類的多串口通信實現
工作了之后才發現,之前在學校里真是狹隘封閉、坐井觀天,拿之前發表的論文來說,工作后接觸到了底層的串口、網口開發,對線程(也叫任務)、操作系統時間片輪流有了了解,對當時寫的API串口接收函數,認為是不妥的。
論文中我假定,與PC通信的底層設備每次回復的數據包長度是一定的,這樣只要這么多字節的數據到來后,就可以一次從緩沖區中將其讀出,然后發送一次消息,通知主線程去處理數據。我之所以有這樣的想法,就是在使用VC++的串口控件、VB的串口控件、包括.net的串口控件時,都提供了這樣一個接口,直接填上多少個字節觸發一次串口接收,就可以在接收函數中對數據處理了。
實際中每次回復的數據長度是變化的,這里永遠都不知道在那個時刻,底層的設備將數據發送完成了。Remon Spekreijse的CSerialPort串口類中是這樣處理的,檢測到數據到來就開始讀取,每次讀取一個字節,然后發送一次消息,這樣處理效果似乎有點低。可行的辦法就是根據現在緩沖區隊列里字節個數,一次讀出來(這樣就有半包、正好一包、或者一包多點3種情況了),按照雙方定義的通信協議來拆包,通過判斷幀頭幀尾確定一包數據的到來。
這里我也糾結了很久,想着怎么能夠一次正好讀出一包數據,沒有找到解決的辦法。這也是串口通信和網口通信的不同,網口是MAC層、IP層、傳輸層、應用層、幀校驗,只要數據到來一般就是一包完整數據。




