多線程CSerialPort類的多串口通信實現


 

多線程CSerialPort類的多串口通信實現 

工作了之后才發現,之前在學校里真是狹隘封閉、坐井觀天,拿之前發表的論文來說,工作后接觸到了底層的串口、網口開發,對線程(也叫任務)、操作系統時間片輪流有了了解,對當時寫的API串口接收函數,認為是不妥的。

論文中我假定,與PC通信的底層設備每次回復的數據包長度是一定的,這樣只要這么多字節的數據到來后,就可以一次從緩沖區中將其讀出,然后發送一次消息,通知主線程去處理數據。我之所以有這樣的想法,就是在使用VC++的串口控件、VB的串口控件、包括.net的串口控件時,都提供了這樣一個接口,直接填上多少個字節觸發一次串口接收,就可以在接收函數中對數據處理了。

實際中每次回復的數據長度是變化的,這里永遠都不知道在那個時刻,底層的設備將數據發送完成了。Remon SpekreijseCSerialPort串口類中是這樣處理的,檢測到數據到來就開始讀取,每次讀取一個字節,然后發送一次消息,這樣處理效果似乎有點低。可行的辦法就是根據現在緩沖區隊列里字節個數,一次讀出來(這樣就有半包、正好一包、或者一包多點3種情況了),按照雙方定義的通信協議來拆包,通過判斷幀頭幀尾確定一包數據的到來。

這里我也糾結了很久,想着怎么能夠一次正好讀出一包數據,沒有找到解決的辦法。這也是串口通信和網口通信的不同,網口是MAC層、IP層、傳輸層、應用層、幀校驗,只要數據到來一般就是一包完整數據。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM