云霞资讯网

Modbus RTU凭什么用3.5个字符时间切帧? RTU没有帧头帧尾,全靠总线

Modbus RTU凭什么用3.5个字符时间切帧?
RTU没有帧头帧尾,全靠总线上"静默多久"来切一帧,这是它和ASCII模式最根本的区别。
串口是异步的,没有时钟线,收发双方都靠波特率自己算每个bit的时间。一个字符就是串口发一个字节:1起始位+8数据位+1停止位,不校验是10个bit,带校验是11个bit。9600波特率下,11/9600≈1.15ms,3.5个字符差不多4ms。
规约里其实有两条静默规则:
帧内字节间隔不能超过1.5个字符时间,超了这帧直接判坏丢弃
两帧之间总线至少静默3.5个字符时间,接收端数到这个静默就知道上一帧发完了
3.5不是整数3也不是4,是当年Modicon定的折中:太短容易误判帧结束,太长又费总线时间。1.5到3.5这段灰色地带就是给软件留的缓冲——中断有延迟,定时器有精度误差,靠这段余量才不至于把正常的字节间隔当成帧结束。
还有个容易被忽略的点:波特率大于19200时,规约不再按3.5字符算,而是直接固定1.75ms当帧间隔。因为这时候字符时间已经太短,继续按3.5算,定时器精度误差会被放大,容易切错帧。
实际写STM32从机,常见做法:收到一个字节就重置定时器,定时设成3.5字符(或1.75ms);超时还没来下一个字节,就认为一帧收完,拿去算CRC。别只靠串口的IDLE空闲中断——那个检测的是一个字符的空闲时间,不够3.5,得单独挂一个定时器。
真要在高波特率下还按3.5字符算,115200时3.5字符才0.33ms,普通定时器中断一抖就超了,统一用1.75ms会稳很多。
嵌入式 Modbus 串口通信 RS485 STM32 单片机 嵌入式开发 物联网