我对Modbus中的字符间空隙有点困惑,以及当主站向从站发送消息时是否需要它。 协议规范说,传输时字节之间的间隔不能超过3.5个字符,但是否有任何具体的最小时间间隔?
我写了一个Modbus驱动程序(主站),它能够与各种设备进行通信,大多数设备在接收消息时似乎并不关心字符之间的任何间隙。然而,我遇到了几个设备,如果不在字节之间加入某种延迟(以微秒为单位),我就无法进行可靠的通信,这种延迟是由波特率决定的。
字符间隙是一个绝对的要求,还是取决于设备的制造和如何实现Modbus协议?
Modbus RTU在传输时是否需要字符间的间隙?
不,事实上 Modbus规格 在本节中指出 2.5.1.1 MODBUS报文RTU帧化 该 "整个电文框必须作为连续的字符流传送。 "要求字符间的空白与规定 "字符间的空白 "是矛盾的。"源源不断".
协议规定,传输时,字节之间不能有超过3.5个字符的间隙... ...
你曲解了协议规范。RTU信息中的字符之间只能有1.5个字符的间隙。
从Modbus规范中: "如果在两个字符之间出现超过1. 5个字符的静默间隔,消息帧将被宣布为不完整,并应被接收方丢弃。"
一个持续时间为3.5个字符的静音(空闲)行必须在消息前出现。即2个(即大于1.5而小于3.5)字符的空隙将过早地结束当前的报文,而下面的字符(该畸形报文的)将是 不 被认为是一个新消息的开始,并被丢弃。
... 是否有任何特定的最小时间量,你必须有一个字节之间?
Modbus规范中没有提到任何这样的要求。这样的要求是不切实际的。
UART不具备通过在字符帧的传输之间插入延迟来测量其输出的能力。增加这样的延迟是一个额外的处理器负担,也是一个定时器的使用。相反,UART已经发展到在波特率允许的情况下以最少的处理器干预来传输字符,例如硬件FIFO和DMA。
A "你必须有最小的时间间隔的字节" 只是降低了有效的数据速率。因此,适当降低波特率可以达到完全相同的数据速率。
字符间隙是一个绝对的要求,还是取决于设备的制造和如何实现Modbus协议?
不,您可能使用了过快的波特率来满足相关设备的需求。
一个微处理器或微控制器应该能够让UART保持忙碌,并且在传输过程中没有任何字符间的间隙。一个在接收过程中需要间隙的UART是一个过载的系统,并且是坏的。对于可靠的通信(没有流量控制),使用足够低的波特率,这样就不需要对传输的字符进行计量。
就是在信息结束时,应该有3.5个字符或更长时间的停顿。
通常在数据传输协议中,在字节序列的前几位,都包含了后面的字节数,但Modbus RTU并没有发送这个长度,决定信息结束的是3.5个字符的停顿。
如果一次发送字节序列,字符之间就不应该有任何停顿。
如果你写的是主站,你就不用担心这个问题,因为是从站必须等待3.5个字符,才能知道主站请求什么时候结束,你从主站那边只要等待从站的回复就可以了,因为你知道从站要发送多少字节,在请求中你已经发送了你要读取多少位或16位的字。
而如果你和一些设备的通信有问题,很可能是由于通信速度和线路质量不好共同造成的。试试更低的波特率吧,但是在字符之间增加等待对我来说意义不大。