Modbus协议CRC校验
算法说明 + 预置1个16位的寄存器为十六进制的FFFF(即全为1);称此寄存器为CRC寄存器。 + 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的低 8位相异或,把结果存放在CRC寄存器。 + 把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位。 + 如果移出位为0:重复第3步(再次右移1位);如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或。 + 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。 + 重复步骤2到步骤5,进行通讯信息帧下一个字节的处理。 + 将通讯信息帧的所有字节按上述步骤计算完成后,得到16位CRC寄存器的高,低字节交换。 + 最后得到的CRC寄存器内容即为:CRC码。
MODBUS CRC校验码的C语言源程序
unsigned short ModBusCRC16(const void *s, int n)
{
unsigned short c = 0xffff;
for(int k=0; k<n; k++)
{
unsigned short b=(((unsigned char *)s)[k]);
for(char i=0; i<8; i++)
{
c = ((b^c)&1) ? (c>>1)^0xA001 : (c>>1);
b>>=1;
}
}
return (c<<8)|(c>>8);
}
注:以平台最后的定义要求为最终要求