文档介绍:
: .
CRC的生成
循环冗余校验(CRC)域为两个字节,包含一个二进制16位值。附加在报文后面 的CRC的值由发送设备计算。接收设备在接收报文时重新计算 CRC的值,并将计算 结果于实际接收到的CRCt相比较。如果两个值不相等,贝V为错误。
CRC的计算, 对其进行后续的计算。只有字符中的8个数据位参与生成CRC的运算,起始位,停止 位和校验位不参与CRC计算。
CRC的生成过程中, 每个8 -位字符与寄存器中的值异或。 然后结果向最低有 效位(LSB)方向移动(Shift) 1位,而最高有效位(MSB)位置充零。然后提取并检查 LSB如果LSB为1,则寄存器中的值与一个固定的预置值异或; 如果LSB为0,则
不进行异或操作。
这个过程将重复直到执行完8次移位。完成最后一次(第8次)移位及相关操 作后,下一个8位字节与寄存器的当前值异或,然后又同上面描述过的一样重复 8次。 当所有报文中子节都运算之后得到的寄存器中的最终值,就是 CRC.
生成CRC的过程为:
1. 将一个16位寄存器装入十六进制FFFF (全1).将之称作CRC寄存器.
2. 将报文的第一个8位字节与16位CRC寄存器的低字节异或,结果置于 CRC寄存 器.
3. 将CRC寄存器右移1位(向LSB方向),.
4. (如果LSB为0):重复步骤3 (另一次移位).(如果LSB为1):对CRC寄存器异或 多项式值 0xA001 (1010 0000 0000 0001).
5. 重复步骤3和4,直到完成8次移位。当做完此操作后,将完成对 8位字节的完 整操作。
6. 对报文中的下一个字节重复步骤 2到5,继续此操作直至所有报文被处理完毕。
7. CRC寄存器中的最终内容为CRC值.
8. 当放置CRC值于报文时,如下面描述的那样,高低字节必须交换。
MODBU协议的CRC校验子程序代码
为方便读者使用MODBUS议,将VC VB ASM5环境下MODBUS议的CR(校验子 程序代码一并给出,供读者参考。
包括起始”冒号”和结束CRLF的报文中的所有字节相加到一个 8位域,故此进位被 丢弃。
2. 从FF (全1)十六进制中减去域的最终值,产生 1的补码(二进制反码)。
3. 加1产生二进制补码.
将LRC置于报文当8位LRC(2个ASCII字符)在报文中传送时,高位字符首先发 送,然后是低位字符。例如,如果 LRC值为十六进制61 (0110 0001):
hi址
功權
LRC
LRC
CR
LF