1004.串口收發數據集成bug

         最近一個碰到一個串口數據解析的bug,調試了整整7天,從排除問題,優化代碼,到真正發現問題所在, 期間經歷感覺好像找到了bug,其實是找到的另外一個bug,期間不斷排雷, 不斷驚喜,不斷 失望,以爲找到問題所在,其實並沒有找到核心問題。

現在對此記錄一下。

1 場景描述:

    模塊功能:以100ms 速度,對外發送各種不同類型數據,都是接受相同類型的數據。

    測試:

    A1 程序運行在ubuntu上,通過usb轉串口,連接無線小模塊,進行數據收發。

    A2 程序運行在另外一臺ubuntu上,通過usb轉串口,連接無線小模塊,進行數據收發。

 2 詭異現象描述    

         每次都在 new 一個對象處出現段錯誤,由於此對象是由google的protobuf 框提供的技術,進行創建 ,由該第3庫進行內存管理, new後,框架進行釋放。所以 一開始,將問題定在此處,以爲是內存不足導致。經實際以top進行觀察,發現內存的 使用率,並不高,大概在0.3%左右進行波動,那麼排除內存不足 問題。 錯誤信息提示,memory corruption (fast) . 顯示內存溢出,又繼續查看所有的線程中使用的new,發現 仍然一無所獲 ,實在 調不  下去了。

3 改變調試思路 

    1  只運行A1程序,取消串口上的無線小模塊,將串口的收發互聯進行測試。代碼可以一直跑下去,不出錯誤。  

    2 使用2臺電腦,進行互測取消掉,無線模塊,使2個串口,進行有線直連。測試代碼3個小時,沒有 任何錯誤。

    3 再次 連上無線模塊進行測試,在運行的過程中,時間不固定,出現 錯誤。和以前現象一致。

 4 分析原因

         無線模塊 的加入,導致大量的 出現錯誤,經過分析是無線模塊傳輸數據,根據無線網絡情況,可能出現信息斷掉,

重新出現後,大量波峯時刻數據,來得串口緩存區,其中出現了某數據幀,關於長度的數據,錯亂,讀寫時,未進行長度

校驗。導致buffer緩存區越界。

 5 解決方案

   串口協議中,接收到的長度數據進行校驗。即可解決。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章