zyok 发表于 2007-8-13 15:36

请教:ModBus RTU协议时,单片机如何识别一帧信息的开始?

51系列单片机在多机通信时有一个RB8来判断是地址还是数据从而决定是否产生中断,而在使用ModBus RTU通信协议时上位机好像不会发个第9位信息来区分是地址还是数据,请问这时单片机如何判断一帧信息的开始呢?

chunyang 发表于 2007-8-13 20:19

靠命令集的约定

你再去看看国内用Modbus最多的电力行业是怎么规定的吧。Modbus仅指了格式,具体内容和应用方式就是自定的了。

mcu430 发表于 2007-8-21 12:43

Modbus仅指了格式,具体内容和应用方式就是自定的了

zhiwei 发表于 2007-8-22 20:28

每桢尾

要求有一定的延时空闲时间,你可以通过这来确定一次接收完毕,下次接收到字节即新桢开始。另外,好像桢是以冒号开始的吧。

zyok 发表于 2007-8-23 11:52

谢谢各位!

ModBus_RTU协议上有这么一段:<br /><br />&lt&lt1.使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。<br /><br />2.整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的&gt&gt<br /><br />问题:第一段说明了一帧信息的开始与结束是以大于3.5个字符的时间间隔来判断,但是第2段不太理解:前半句说一帧完成之前若超过1.5个字符的时间间隔接收设备判为一个新消息,而后半句又说一个新消息在小于3.5个字符的时间内接着前一个消息开始,接收的设备将认为它是前一消息的延续.&nbsp;若一帧消息传送中出现了大于1.5个字符小于3.5个字符的时间间隔,接收设备该如何处理???<br />

zhxlx 发表于 2007-8-25 10:06

3.5的延时和地址

每桢之间3.5字节的延时和首字节本机地址或广播地址0来判断

keer_zu 发表于 2007-9-14 10:52

也碰到同样的问题,请指点

问题:第一段说明了一帧信息的开始与结束是以大于3.5个字符的时间间隔来判断,但是第2段不太理解:前半句说一帧完成之前若超过1.5个字符的时间间隔接收设备判为一个新消息,而后半句又说一个新消息在小于3.5个字符的时间内接着前一个消息开始,接收的设备将认为它是前一消息的延续.&nbsp;若一帧消息传送中出现了大于1.5个字符小于3.5个字符的时间间隔,接收设备该如何处理???<br /><br />6楼的回答不太明白。<br /><br />还有:<br /><br />1、能不能用一帧的长度判断帧的长度?<br /><br />2、modbus对等待超时等错误的处理有没有统一规定?其他的协议有没有这方<br />&nbsp;&nbsp;&nbsp;面的内容?<br /><br />

gaoruisolax 发表于 2018-12-11 19:58

zyok 发表于 2007-8-23 11:52
ModBus_RTU协议上有这么一段:&lt&lt1.使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络 ...

ModbusRTU的一帧数据的结束,只能按照间歇时间来判断。用3.5个字符时间来判断,超过3.5个字符认为一帧结束。(波特率大于19200的,直接按1.75ms判断)。可以用一个定时器来判断时长。
完整的一帧消息的字符与字符之间的时间间隔无需关注。只是说在大于1.5字符和小于3.5字符时间之内,该帧未完成时,再有数据会认为是前一帧的。
页: [1]
查看完整版本: 请教:ModBus RTU协议时,单片机如何识别一帧信息的开始?