首先再次确认计算步骤:
1)、预置1个16位的寄存器为十六进制FFFF(即全为1111 1111 1111 1111),称此寄存器为CRC寄存器;
2)、把第一个位转换成8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器,高八位数据不变;
3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4)、如果移出位为0:重复第3步(再次右移一位);
如果移出位为1,CRC寄存器与多项式进行异或(A001:1010 0000 0000 0001);
5)、重复步骤3和4,直到右移8次,这样第一个字的整个8位数据全部进行了处理
6)、重复步骤2到步骤5,用上一个CRC的结果与进行通讯信息帧下一个字节的处理;
7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
8)、最后得到的CRC寄存器内容即为:CRC码。
实例:发送数据 2D 00 03 07 计算出校验码
第一步确认CRC校验的模型为 CRC-16/modbus 多项式为X16+X15+X2+1
第二步由标准CRC生成多项式表可查出多项式的简写为8005。
8005转换成4位八进制为 1000 0000 0000 0101
高低位字节颠倒生成多项式1010 0000 0000 0001
开始计算:
1)把第一个字节2D转找成8位二进制0010 1101 与CRC寄存器FFFF低8位进行异或。
2)异或的结果放的CRC寄存器中
3)CRC寄存器内容右移
4)右移为0,再移 右移为1与多项式1010 0000 0000 0001异或
5)直到第一个字节的8位全部处理完
6)用第一个字异或的结果低8位与第二个字节进行异或。
7)直到5个字节全部处理完,得到的CRC码
8)把得到的CRC码 进行高低字节交接,就是最后的校验码
计算过程见手写图:
计算得到的结果为 1100 0100 0011 1001转换为十六进制为 C4 39 进行高低字节交换得到校验码为 39 C4
与软件计算的结果对比一至 如图
发送数据 2D 00 03 07
加上校验码发送的数据 2D 00 03 07 39 C4