赞
踩
MODBUS的CRC校验过程为:
1.预置1个16位的寄存器为0xFFFF(即全为1),称此寄存器为CRC寄存器;
2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与CRC寄存器的低8位相异或,把结果赋值给CRC寄存器;
3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4.如果移出位为0:重复第3步(再次右移一位); 如果移出位为1:CRC寄存器与0xA001(1010 0000 0000 0001)进行异或,结果赋值给CRC寄存器;
5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
8.最后得到的CRC寄存器内容即为:CRC码。
之所以有高低位之说,是因为有的程序没有做步骤7,有的程序做了步骤7。
下面是Java实现的一个CRC校验码生成代码:
private String GetCRC( byte[] frame ) { int CRC = 0x0000ffff; int POLYNOMIAL = 0x0000a001; int i, j; for (i = 0; i < frame.length; i++) { CRC ^= ((int) frame[i] & 0x000000ff); for (j = 0; j < 8; j++) { if ((CRC & 0x00000001) != 0) { CRC >>= 1; CRC ^= POLYNOMIAL; } else { CRC >>= 1; } } } CRC = ( (CRC & 0x0000FF00) >> 8) | ( (CRC & 0x000000FF ) << 8); //转换高低位 return Integer.toHexString(CRC); }
这是一个在线CRC校验码生成工具,生成的校验码就是没有做步骤7的,需要自己转换一下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。