Modbus 通讯协议数据帧之间的时间停顿间隔 “3.5字符”定义

版权声明:本文为博主原创文章,转载请注明出处 http://blog.csdn.net/lusirking,所有文章同步在公众号“Qt开发社区”发布 https://blog.csdn.net/lusirking/article/details/53212195


Modbus 通讯时规定主机发送完一组命令必须间隔3.5个字符再发送下一组新命令,这个3.5字符主要用来告诉其他设备这次命令(数据)已结束,而这个3.5字符的时间间隔采用以下方式计算:

1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下)
这样说起来一般情况下1个字符就包括11位
那么3.5个字符就是3.5*11=38.5位

还有比如没有校验位的
1个字符包括1位起始位、8位数据位(一般情况)、1位停止位(一般情况下)

这样说起来一般情况下1个字符就包括10位
那么3.5个字符就是3.5*10=35位

波特率含义是每秒传输的二进制位的个数
比如9600bps,意思就是说每1秒(也就是1000毫秒)传输9600个位,
反过来说传输9600个二进制位需要1000毫秒
那么传输38.5个二进制位需要的时间就是:
38.5/9.6=4.0104167毫秒
MODBUS RTU要求一帧数据起始和结束至少有大于等于3.5个字符的时间
在波特率为9600的情况下,只要大于4.0104167毫秒即可!

一般,为了简单起见,可以将传输45Bit的时间四舍五入后的整型值作为两个数据帧之间的时间间隔,并以此来判断报文接收的完整性。
--------------------- 
作者:lusirking 
来源:CSDN 
原文:https://blog.csdn.net/lusirking/article/details/53212195 
版权声明:本文为博主原创文章,转载请附上博文链接!

总结:

1  串口发送一帧数据时,两个字节的间隔时间是必须小于3.5个字符 时间 否则就算两个字节不处于同一帧数据中。

2  波特率:发送二进制数据位的速率,习惯上用 baud 表示,即我们发送一位二进制数据的持续时间=1/baud。波特率不同 ,那么 3.5个字符的时间也不同。

3 rs485串口配不一样就会导致一个字节的bit位数不一样就会导致3.5个字符时间不一样。

4 总线上的接收数据长度与3.5个字符时间无关。不管你一帧数据有多长 但是字节之间的发送时间一定要满足小于等于3.5个字符即可

 //串口接收延时,适应ModBus-RTC协议
        if(usart1_rx_framedata.frame_delay_flag == TRUE )
        {

         //   if( usart1_rx_framedata.frame_delay_Count++ >= 3 )    // 字节延时时间大于3.5个字符
         // 数据接收不全是不是等待的一帧的时间太短了呢
         // 10us*10=100us 波特率为9600 则那么接收9.8个bit 需要1ms
         /*
            1个字符包括
            1位起始位、
            8位数据位(一般情况)、
            1位校验位(或者没有)、
            1位停止位(一般情况下)
            这样说起来一般情况下1个字符就包括11位那么3.5个字符就是3.5*11=38.5位
            还有比如没有校验位的1个字符包括
            1位起始位、
            8位数据位(一般情况)、
            1位停止位(一般情况下)
            这样说起来一般情况下1个字符就包括10位那么3.5个字符就是3.5*10=35位
            那么传输38.5个二进制位需要的时间就是:
            38.5/9.6=4.0104167毫秒
            我们取4.5ms    10us * X =4.5 ms   推出X = 450
            
         */
          if( usart1_rx_framedata.frame_delay_Count++ >= 450 )    // 字节延时时间大于3.5个字符
            {
                Refresh_Iwdg();
                usart1_rx_framedata.frame_delay_flag = FALSE;
                usart1_rx_framedata.frame_delay_Count = 0;
                usart1_rx_framedata.frame_end_flag = TRUE;    //帧结束
            } 
        }
        #endif

 

你可能感兴趣的:(rs485总线,串口总线)