一次"抓不到"的通信丢包
某款工业设备通过 RS485 与上位机通信,协议是 Modbus RTU,波特率 19200。客户反馈:偶尔丢包,概率大概每天几次。设备重启后恢复,但过几天又会出现。
排查的第一步是抓包。工程师拿了一个 USB 转 RS485 的适配器,接到总线上,用串口助手抓数据。抓了两天,没抓到丢包的现场。
问题出在哪?
第一,串口助手只能显示"收到了什么",不能显示"什么时候收到的"。丢包的时候,可能是时序问题(比如响应太慢),但串口助手看不出时间间隔。
第二,串口助手抓的是上位机侧的数据,设备侧发出的数据经过 RS485 收发器、双绞线、再到适配器,中间可能有信号完整性问题。抓包点不对,就抓不到真实的问题。
第三,丢包是偶发的,两天才几次。靠人工盯着串口助手,根本抓不到。
正确的做法是:用逻辑分析仪抓 RS485 差分信号和 MCU 的 UART 引脚信号,同时记录时间戳。 逻辑分析仪可以长时间运行,触发条件设为"异常帧"(比如 CRC 错误、响应超时),自动捕获现场。
换用逻辑分析仪后,当天就抓到了。波形显示:设备收到请求后,MCU 的 UART 发送引脚上数据正常,但 RS485 差分信号在某个字节的中间出现了明显的畸变。根因是 RS485 收发器的方向控制引脚(DE)切换太慢,导致最后一个字节的尾部被截断。
这个案例的核心是:排查通信错误,需要一套工具链,而不是单一的工具。 这篇文章要讲的,就是这套工具链的组成和