掃描關注一起學嵌入式,一起學習,一起成長

【一分鐘聊嵌入式】,力求精簡,爭取用一分鐘左右的時間讀完。每篇文章討論一個嵌入式相關的話題,技術、職場、學習方法,或者一段程序等。有小伙伴想發表自己的觀點,或想了解哪些內容,公眾號后臺留言即可。感謝關注!
本期話題
前兩天有小伙伴在交流群里咨詢:在串口通信的時候,如何應對其中一幀數據丟失或者干擾的情況嗎?之前分享過一篇如何設計通信接口協議的文章:如何編寫通信接口協議。這篇文章側重通信雙方交互的數據格式。本文來簡單聊一聊,如何避免串口數據通信過程丟幀的問題。聊一聊
看到這個問題,有很多大佬給出了自己的看法,列舉幾點:- 從串口原理設計的弱點進行分析,電磁打擾?波特率?數據幀太多?線太長?等等。
接下來,根據我對題目的理解,來說幾點處理措施,供參考。首先說一下對題目的理解,我覺得這個問題的側重點在于,串口通信丟幀(或干擾)問題已經發生了,該如何進行處理。為了保證通信雙方數據傳輸的可靠和正確性,我們一般會在硬件上做一些防止干擾的措施,同時在數據傳輸中添加校驗等。接收端收到的數據校驗不通過,則直接丟棄,不進行處理。加了這些措施,主要是為了保證接收并處理正確的數據。如果數據傳輸出錯,這一幀數據不就直接丟棄了嗎?接下來該怎么辦呢?其實設備之間通信(不限于串口通信),都會設計數據通信協議,其中除了說明通信數據幀的格式之外,也會對出現丟幀情況如何處理進行說明,這樣通信雙方就按照這個規則進行處理。串口通信,穩定可靠的通信機制一般是:一問一答的方式;即發送方發送數據之后,需要收到應答,才能確保數據發送成功并被正確處理。否則的話,發送方就認為傳輸出錯,根據具體情況,進行重發。為了能夠確保數據發送與應答一一對應,可以通過在數據幀中添加幀序號的方法,確保每一幀數據的序號是唯一的,發送與應答的幀序號如果能夠對應上,則說明應答幀接收到,可以進行后續處理。如果出現丟幀問題,根據具體的應用場景,會有不同的處理措施:控制端發送指令數據給被控端,接收端沒有接收到數據或者接收到的數據出錯,則不會進行控制動作以及發送應答幀。發送端一段時間內沒有接收到指令應答,可以適當地進行指令重發。這種場景,發送端可以給每一個數據包進行標號,同時接收端根據接收到的數據包序號進行處理,并給出應答數據包,其中應答數據包中可以攜帶期待的下一包數據的序號。如果發送端的數據出錯,則不會收到應答幀,可以進行重發當前幀。如果接收端收到正確的數據幀,但是發送端收到的應答幀異常,則認為應答數據傳輸出錯。發送端可以嘗試進行重發當前幀,接收端在收到重復的數據包后,再重新發送相應的應答幀。這種一問一答的方式,雖然可以保證數據傳輸的可靠性。難免會存在傳輸效率低的問題。如果發送的數據包比較多,可否等到數據包全部發送完成后,最后再統一進行校驗處理呢?這種處理該如何做呢?提示:可以在數據包中添加序號,并且在第一個數據包中添加總共要發送的數據包個數。剩下的工作交給接收端進行處理。

覺得文章不錯,點擊“分享”、“贊”、“在看” 唄!