最近在做python serial模塊對串口的資料進行接收和寫入,遇到一個問題.python在接收和讀取串口資料時,有時候資料并不會一次性讀完,這樣我在做決議的時候就會出現資料不全而導致的丟包現象,完整的的資料有固定幀頭,也有校驗碼,但是因為資料的長度不固定,所以在決議的時候還是出現問題,串口傳給python的是byte型,我以b'固定幀頭'切割后的資料再加上b'固定幀頭',這樣沒有接收完的資料也會加上b'固定幀頭',但是決議的時候資料是錯誤的資料,無法決議就會丟棄,我該如何操作,求大神指導
uj5u.com熱心網友回復:
給每個資料加 頭 加尾 和 校驗。 接收到資料后組包,組包完成后處理邏輯。再復雜一點可以設計錯誤重傳
uj5u.com熱心網友回復:
我是接手別人的代碼,串口協議是他們制定的,只有固定開頭和校驗碼,沒有結尾,而且資料長度是不固定的,我不能判斷資料到底有沒有讀完,因為牽扯到之前版本的產品,所以協議還不能修改
現在這個問題已經解決了,但還是要謝謝兄弟的建議
uj5u.com熱心網友回復:
最近也在寫串口通信的代碼,串口看起來界面太簡單,比起socket,少了很多協議處理的包裝,誤碼的處理,意外事件的處理都得自己上。實際上一個健壯完善的串口通信介面從頭擼代碼,比起socket而言,要難得多。也難怪CDT規約最普遍,而101花了很長時間才普及。
現在看來,即便是101規約,已經實作工業化了那么久,還是因為幀結構太復雜,廠商之間所能兼容的部分也是有限,不可能輕易所有的實作都能兼容。
總結一下想法,真正健壯、魯棒的串口通信介面,還是最好要把資料ATM、或者TCP/IP的方式進行分組處理,不要圖簡單,直接把應用層加載到物理層上,而是自己先實作一個資料鏈路層,再加載應用層,會讓作業變得簡單很多。
uj5u.com熱心網友回復:
請問怎么解決的啊?我也遇到了一樣的問題!
uj5u.com熱心網友回復:
先對資料做出判斷,從協議頭開始,協議頭正確的話然后看資料長度是否一致,如果資料沒有接受完資料長度是對不上的,這時候把不全的資料放到串列里先存起來,第二次遇到的資料協議頭都對不上,直接和第一次沒有接收完的資料拼接起來,繼續決議,這樣就是ok的,本人親自測驗這種方法是可行的轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/67459.html
標籤:智能硬件
上一篇:51單片機
