AIGC标识 串口协议设计:帧结构、超时与重传

■ 一、协议不好用,问题多半在边界

串口本身只负责传字节。协议要解决的是:怎么知道一帧从哪开始、到哪结束、有没有传错、丢了怎么办、重复了怎么办。

现场九成的"通信不稳定",其实不是电气问题,而是这五个边界没定义清楚。

■ 二、帧结构:三个字段缺一不可

一个够用的帧,至少要有:

· 帧头:区分数据与噪声。单字节帧头容易误判,建议用双字节或带固定长度的帧头。
· 长度:让接收方知道还要收多少字节。没有长度字段,就只能靠超时猜帧尾,一遇到长帧就乱。
· 校验:CRC16 比累加和可靠得多,成本也不高。

可选字段:地址(多从机时必需)、功能码、序号(重传时必需)。

■ 三、接收状态机:不要在中断里解析

常见错误是在串口中断里直接拼包、判帧。中断里应该只做两件事:把字节放进环形缓冲、更新计数。解析放到主循环或独立任务里做。

原因很简单:中断执行时间必须短,而解析涉及 CRC、分支判断,容易造成丢字节。

状态机建议四态:找帧头 → 收长度 → 收数据 → 校验交付。每态超时都回到找帧头,避免半帧卡死。

■ 四、超时:分三种,不要只设一个

· 字节间超时:一帧内两个字节之间允许的最大间隔,通常几毫秒到几十毫秒。
· 帧超时:整帧最大接收时间,由长度与波特率算出,留 2 倍余量。
· 应答超时:发出请求后等待回复的时间,必须大于"从机处理时间 + 传输时间"。

只有一个超时的设计,要么误判(太短),要么卡死(太长)。

■ 五、重传与去重:靠序号

重传的前提是能识别重复。做法:请求带递增序号,从机回复时带回同一序号;主机只接受序号匹配的回复。

没有序号的重传,会出现"同一个动作执行两次"的严重后果——比如重复写入校准参数、重复触发一次采样。

■ 六、异常处理:三种情况要分开

· 校验失败:丢弃当前帧,回找帧头,不重传(等下次轮询)。
· 无应答:按次数重传(一般 2–3 次),超过则标记该从机离线。
· 半帧卡住:超时后强制复位接收状态机,并记录一次异常计数。

这三种要分别计数,现场排障时才知道是"干扰多"还是"从机死"。

■ 七、可观测性

协议层要能导出三类统计:每秒帧数、校验失败次数、超时次数、离线次数。这四个数一摆出来,通信质量就清楚了,不用猜。

■ 八、一个检查清单

· 帧头是否够独特(双字节或带长度)
· 有没有长度字段
· 校验是否用 CRC16
· 解析是否在中断外
· 三种超时是否分别设置
· 重传是否有序号去重
· 异常是否分类计数
· 能否导出通信统计

■ 九、最后一句

串口协议的难点不在"能通",而在"出错时能说清哪里错了"。把边界定义清楚,现场就少一半扯皮。

posted @ 2026-10-28 07:51  『风格』  阅读(16)  评论(0)    收藏  举报