本文共 615 字,大约阅读时间需要 2 分钟。
差不多啊,但为了让它更自然一点,我可以稍微调整一下:
最近遇到一个挺让人抓狂的技术难题,涉及串口数据解析。从排除问题到优化代码,再到找到真正的原因,过程踏实又波动,经历了精心调试中的各种起伏。
我是程序A1,负责在Ubuntu上通过usb转串口,和另一个同样配置的程序A2通信。我们的任务是处理和解析来自无线模块的数据,速度要快,100ms一次循环。
每次都会在新创建obuf结构体时出段错误。这个结构是通过protobuf框架处理的,内存由该框架自己管理。错误提示是太快的内存腐蚀,发生在new后第3库运行释放时。
一开始我以为内存不足,导致new的对象无法成功,但top显示内存使用率只有0.3%,证实了内存不是问题。接着,我发现线程中new数量不多,暂时无法找到线索。
单独运行A1,取消无线模块,直接连接串口后发。你可以测试很长时间,甚至超过一小时,这个问题还没出现。说明问题可能不在代码里,而是与无线模块相关。
两个系统互相测试,用双台带有无线模块的电脑,这样串口互连,稳定运行超过3小时,程序都没错误。
再次连接无线模块,这时候错误频发,故障点在串口只与无线模块连的时候出现。
无线信号问题。数据传输过程中断了,断点积累。当数据到达串口时,出现长度异常,导致缓冲区越界。
接收到数据后进行长度校验。如果校验不通过,丢弃数据。这样,应用程序就能更稳定地处理串口数据流了。
转载地址:http://towxz.baihongyu.com/