我開發軟體用于接收串口發送來的資料。現在有這樣一個問題
假設協議約定
00 00 00 04 0f 0e ff ff
前面4個位元組表示整個資料有多長 這里04 表示后面有 4 個位元組
最后兩位元組 ff ff 為crc16
如果傳輸有誤,04 變成了 05
那么認為沒有接收完成, 等待下一個資料到來,假設接下來收到另一條正確的
00 00 00 04 0f 0e ff ff
此時認為這樣的資料是一個完整的
00 00 00 05(誤傳的) 0f 0e ff ff 00
此時crc16校驗失敗,放棄此條資料,那么問題是后面接下來的所有資料都錯了,怎么解決?
此種情況下應該關閉串口再打開嗎?還有什么更好的方法?多謝!
uj5u.com熱心網友回復:
個人覺得,一收一答:收到正確,請求下一條資料;收到校驗錯誤的資料,請求重傳。uj5u.com熱心網友回復:
定義個幀頭與幀尾呀,通過重新搜索幀頭定位。你這協議定義的不好uj5u.com熱心網友回復:
第一,協議定義本身有問題,可靠的通信定義應該是標志頭+(資料長度)+校驗+標志尾第二,如果通信速度不快的話,可以在軟體里面設超時。比如可以設定如果50ms內沒有資料再來,可以認定本幀已發送完畢,可以接收處理了。
15年的C++工業串口通信編程經驗!
uj5u.com熱心網友回復:
通訊協議:開始標識+命令+ 資料長度n+ 資料 + 校驗,通過協議檢測函式就可以判斷資料是否已接收完畢,檢測到錯誤的資料后,可以根據機制忽略或請求重發。uj5u.com熱心網友回復:
做一個回圈佇列,收到錯誤時候此資料不丟,下次接收的資料放在錯誤資料尾部,然后重新找 00 00 00 04 如果找到正確的資料,則把前部分資料丟掉。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49141.html
標籤:網絡及通訊開發
上一篇:求有獲取麥克風的音頻的程式資料
下一篇:基于連通域分析的個數檢測
