CRC-16 / MODBUS :
1)CRC寄存器初始值为 FFFF;即16个字节全为1;
2)CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) ‘H’表示16进制数,‘B’表示二进制数
计算步骤为:
(1).预置 16 位寄存器为十六进制 FFFF(即全为 1) ,称此寄存器为 CRC 寄存器;
(2).把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,把结果放于 CRC 寄
存器;
(3).检测相异或后的CRC寄存器的最低位,若最低位为1:CRC寄存器先右移1位,再与多项式A001H进行异或;若为0,则CRC寄存器右移1位,无需与多项式进行异或。
(4).重复步骤 3 ,直到右移 8 次,这样整个 8 位数据全部进行了处理;
(5).重复步骤 2 到步骤4,进行下一个 8 位数据的处理;
(6).最后得到的 CRC 寄存器即为 CRC 码。
附参考:
数据(16进制):01 03 61 00 00 02 CRC校验:F7 DB
附C语言实现代码:
-
#include <stdio.h>
-
int main(void)
-
{
-
unsigned short tmp = 0xffff;
-
unsigned short ret1 = 0;
-
unsigned char buff[6] = {0};
-
buff[0] = 0x01;
-
buff[1] = 0x03;
-
buff[2] = 0x61;
-
buff[3] = 0x00;
-
buff[4] = 0x00;
-
buff[5] = 0x02;
-
for(int n = 0; n < 6; n++){/*此处的6 -- 要校验的位数(实际是字节数自己备注)为6个*/
-
tmp = buff[n] ^ tmp;
-
for(int i = 0;i < 8;i++){ /*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/
-
if(tmp & 0x01){
-
tmp = tmp >> 1;
-
tmp = tmp ^ 0xa001;
-
}
-
else{
-
tmp = tmp >> 1;
-
}
-
}
-
}
-
/*CRC校验后的值*/
-
printf("%X\n",tmp);
-
/*将CRC校验的高低位对换位置*/
-
ret1 = tmp >> 8;
-
ret1 = ret1 | (tmp << 8);
-
printf("ret: %X\n",ret1);
-
return 0;
-
}
输出结果:
-
F7DB
-
ret: DBF7