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 解决方案

   串口协议中,接收到的长度数据进行校验。即可解决。 

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