• 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

  • 相关阅读:
    PHP时间戳常用转换
    redis基本指令
    P2501 [HAOI2006]数字序列
    P2679 子串
    P2759 奇怪的函数
    P6823 「EZEC-4」zrmpaul Loves Array
    P6631 [ZJOI2020] 序列
    P2887 [USACO07NOV]Sunscreen G
    P3287 [SCOI2014]方伯伯的玉米田
    拓展欧几里得算法揭秘
  • 原文地址:https://www.cnblogs.com/zhangpengshou/p/2210108.html
Copyright © 2020-2023  润新知