ModbusRTU模式和结束符(转)

Modbus RTU模式的协议字段

起始位

设备地址

功能码

数据

CRC校验

结束符

至少3.5个字符

8bit

8bit

N*8bit

16bit

至少3.5个字符

Modbus协议RTU模式要求每一帧的起始和结束都以至少3.5个字符为间隔。

每个字符间隔是字符位数/波特率,以1位起始位,8位数据,1位停止位,无奇偶校验位的10位数据。

以波特率为9600b/s为例,字符间隔为1.04ms,也就是每一帧的开始和结束都伴随着至少3.5*1.04=3.64ms的时间间隔。

在字节流中以1.5个字符时间作为帧间间隔,以上面的通信速率,则1.5*1.04=1.56ms,即字符流中出现1.56ms的间隔时可能意味着一帧数据结束。

但必须同时满足其后的一段时间内(2个字符)不会再接收到字符,否则认为结束的该帧为错误帧。

由于收到的每个字节都有可能成为一帧数据的最后一个字节,因此,每接收一个字节,关闭上一个已经开启的3.5个字符时间和1.5个字符时间的定时器,处理完接收到得数据后再次启动3.5个字符时间和1.5个字符时间的定时器,以检测该帧数据的结束

这也就是上面所说的在帧间间隔后的一段时间内(2个字符)不能接收到数据,否则该帧为错误帧。1.5个字符时间和3.5个字符时间的定时起点是一致的,这是Modbus协议RTU模式的关键之处

当然这也增加了系统的中断负荷。在发生1.5个字符时间中断后,处理其接收到得数据(这里未考虑设备地址、超时、奇偶校验等错误),计算接收到的字符数-2个字节的CRC校验和,将计算结果与接收到得最后两个字节(当做发送的CRC校验)进行比较,从而得知这是否是完整的一帧数据。CRC校验正确,说明这是一帧完整的数据,CRC校验错误,说明这是一帧错误的数据帧,数据帧不完整。

发生1.5个字符时间中断后,如未发生3.5个字符时间中断,再次接收到字符,同样说明接收到得是一帧不完整的数据帧;如随后发生3.5个字符时间中断,则处理刚接到的完整数据帧,给予对应的应答。这里的3.5个字符时间同时也可作为下一帧数据的起始

转自:http://blog.csdn.net/zhongjiezhenuaa/article/details/6552386

原文地址:https://www.cnblogs.com/zhangpengshou/p/2210108.html