串口日志染色与帧解析

一屏黑白日志看不清重点?按级别和时间戳着色,再把里面的 Modbus 报文和 CAN 帧捡出来,校验和周期一起列。

最多分析 5000 行、显示前 300 行;Modbus RTU 必须通过 CRC 校验才算帧,CAN 支持 candump 的两种常见格式。

日志里先看什么

串口日志最有价值的是「异常前后的上下文」,不是某一行本身。先按 ERROR、WARN 过滤,找到第一条异常,再往前看二三十行,通常能看到它是因为哪条命令、哪个返回值触发的。染色把时间戳、级别和十六进制分开,就是为了让这个来回翻的过程快一点。

Modbus 调试先确认三件事:从站地址对不对、功能码和寄存器范围对不对、CRC 有没有通过。CRC 不通过通常是线序接反、波特率不匹配、帧被截断,或者 RS-485 的 A/B 接反。工具把 CRC 不通过的候选单独计数,就是提醒你「这里有报文,但没解对」。

CAN 调试先看 ID 集合和周期。正常的总线上,每个 ID 的周期应该稳定,抖动通常来自总线负载过高、节点发送排队或者终端电阻不匹配。某个 ID 突然停止、数据变化次数异常少、DLC 和预期不符,都是排查方向。总线两端各 120Ω 终端电阻不能少,也不能多。

日志本身也会骗人。时间戳可能来自上位机而不是设备,缓冲区溢出会丢行,USB 转串口在高压差下会丢字节。怀疑丢数据时,先降波特率、换短线和带屏蔽的线,再回来分析协议。能稳定复现的日志,比一次“看起来很奇怪”的日志更有用。

需要单独核对报文格式,用Modbus 报文解析;串口波特率误差和采样点计算在串口波特率误差;CRC 参数速查在CRC 校验。

常见问题

为什么有些十六进制串没有被识别成 Modbus?

Modbus RTU 必须有合法的 CRC16。日志里的随机十六进制、截断的报文、少了最后两个字节的串都过不了校验,工具宁可不当成帧,也不愿给出一份假解析。确认帧完整、字节数对得上再试。

CAN 的两种格式都支持吗?

支持 candump 的两种常见输出:带通道名和方括号的 `can0 123 [8] 11 22 …`,以及紧凑的 `123#1122334455667788`。行首带 `(时间戳)` 的也能识别,时间戳用来算每个 ID 的周期和总线负载。

Modbus ASCII 和 RTU 怎么区分?

ASCII 帧以冒号开头,内容全是可打印十六进制字符,末尾是 LRC 校验;RTU 是二进制字节流,末尾是两字节 CRC16(低字节在前)。两种帧的从站地址、功能码和寄存器布局是一样的,只是传输编码不同。

功能码后面的寄存器值怎么读?

默认按无符号 16 位大端解释,和 Modbus 规范一致。温度、电流这类量常常带符号或需要乘系数(比如值 ÷ 10),工具给出原始值,换算要按设备手册来。32 位量通常占两个寄存器,高低字顺序各家不同。

CAN 周期统计为什么有的 ID 没有数值?

周期要靠时间戳算。candump 默认输出不带时间戳,需要加 `-ta`(绝对时间)或 `-L`(带日志时间)再导出。没有时间戳时仍能统计帧数、DLC 和数据变化次数,只是算不出间隔。

日志太长会不会卡?

页面最多分析五千行、显示三百行,超出的部分会截断。要分析完整日志,建议先用 `grep` 或时间范围筛出相关片段,再粘进来;或者导出 CSV 后在表格软件里做统计。