博客
关于我
1004.串口收发数据集成bug
阅读量:588 次
发布时间:2019-03-12

本文共 615 字,大约阅读时间需要 2 分钟。

差不多啊,但为了让它更自然一点,我可以稍微调整一下:

最近遇到一个挺让人抓狂的技术难题,涉及串口数据解析。从排除问题到优化代码,再到找到真正的原因,过程踏实又波动,经历了精心调试中的各种起伏。

场景描述

我是程序A1,负责在Ubuntu上通过usb转串口,和另一个同样配置的程序A2通信。我们的任务是处理和解析来自无线模块的数据,速度要快,100ms一次循环。

诡异现象

每次都会在新创建obuf结构体时出段错误。这个结构是通过protobuf框架处理的,内存由该框架自己管理。错误提示是太快的内存腐蚀,发生在new后第3库运行释放时。

一开始我以为内存不足,导致new的对象无法成功,但top显示内存使用率只有0.3%,证实了内存不是问题。接着,我发现线程中new数量不多,暂时无法找到线索。

调试思路

  • 单独运行A1,取消无线模块,直接连接串口后发。你可以测试很长时间,甚至超过一小时,这个问题还没出现。说明问题可能不在代码里,而是与无线模块相关。

  • 两个系统互相测试,用双台带有无线模块的电脑,这样串口互连,稳定运行超过3小时,程序都没错误。

  • 再次连接无线模块,这时候错误频发,故障点在串口只与无线模块连的时候出现。

  • 原因分析

    无线信号问题。数据传输过程中断了,断点积累。当数据到达串口时,出现长度异常,导致缓冲区越界。

    解决方案

    接收到数据后进行长度校验。如果校验不通过,丢弃数据。这样,应用程序就能更稳定地处理串口数据流了。

    转载地址:http://towxz.baihongyu.com/

    你可能感兴趣的文章
    Lua websocket长连接
    查看>>
    SQL 分页查询 返回总条数
    查看>>
    重写的特点
    查看>>
    【数据库】MySQL导入文件与导出文件
    查看>>
    计算机网络UDP协议和TCP协议
    查看>>
    Linux运行C语言文件
    查看>>
    C字符串高级
    查看>>
    2010-03-25 函数题
    查看>>
    C语言_动态内存分配练习
    查看>>
    Linux学习_系统进程概念
    查看>>
    七层网络模型(待添加)
    查看>>
    考研复试——KY276 Problem C
    查看>>
    老鸟带你画tiled lines
    查看>>
    MybatisPlus自定义Sql实现多表查询
    查看>>
    Java位运算,负数的二进制表示形式,int类型最大值为什么是2的31次方-1
    查看>>
    PyQt5快速上手基础篇10-QSettings用法
    查看>>
    JQuery--手风琴,留言板
    查看>>
    MFC 自定义消息发送字符串
    查看>>
    goahead 下goaction测试与搭建
    查看>>
    Adding Powers
    查看>>