首页 > 编程知识 正文

crc校验计算方法,crc在线校验计算校验位

时间:2023-05-04 04:22:40 阅读:260565 作者:102

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("%Xn",tmp); /*将CRC校验的高低位对换位置*/ ret1 = tmp >> 8; ret1 = ret1 | (tmp << 8); printf("ret: %Xn",ret1); return 0;}

输出结果:

F7DBret: DBF7

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。