您现在的位置是:首页 > 变频技术 > 变频技术
Modbus通信的CRC校验是如何实现的?
来源:艾特贸易2017-06-04
简介答: Modbus 通信的 RTU 模式中,规定信息帧的最后两个字节用于传递 CRC 码。发送方将信息帧中的地址域、功能码、数据域的所有字节按规定的方式进行位移并进行 XOR (异或)计算,即
答:Modbus通信的RTU模式中,规定信息帧的最后两个字节用于传递CRC码。发送方将信息帧中的地址域、功能码、数据域的所有字节按规定的方式进行位移并进行XOR(异或)计算,即可得到2B的CRC码,并把包含CRC校验码的信息帧作为一个连续的流进行传输。接收方在收到该信息帧时按同样的方式进行计算,并将结果同收到的CRC码的双字节进行比较,如果一致就认为通信正确,否则认为通信有误,从站将发送CRC错误应答。 RTU模式一般采用CRC-16冗余校验方法,CRC-16的校验码为16位(2B),其中低字节在前,高字节在后。实现CRC校验有两种方法:根据CRC校验的定义公式进行计算,或者在程序中建立CRC校验值表。在程序中使用前者更容易实现,需要使用CRC生成多项式X16+X15+X2+1。该多项式对应的码组系数为18005H(十六进制),去除最高位,对应的16位余数为8005H,即为CRC-16常数。CRC-16的校验过程如下:将CRC寄存器的每一位预置为1;把该寄存器值与8位的信息帧数据进行异或,结果存于该寄存器;对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补0,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与CRC-16常数进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8位数据处理完毕,用此时寄存器的值与下一个8位数据异或并进行如前一样的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。CRC添加到消息中时,先加入低字节,然后加入高字节。CRC-16子程序框图如图4-16所示。 图4-16 CRC-16子程序框图