CRC-16 / MODBUS 校验计算方法

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

 

  • 32
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
CRC-16/MODBUS使用的生成多项式为x16 + x15 + x2 + 1,它的计算方法如下: 1. 将数据按照二进制形式表示,并在数据末尾补0,使其位数等于生成多项式的位数,即16位。这个补零操作称为“填充”(Padding)。 2. 将填充后的数据与16位的初始值0xFFFF进行异或操作,结果作为计算的初始值。 3. 依次将每个数据位与初始值的高位进行异或操作,如果异或结果为1,则将初始值左移一位并与生成多项式进行异或操作,否则将初始值左移一位。 4. 重复第3步,直到所有数据位都被处理完毕。最终得到的16位结果就是CRC-16校验码。 下面举个例子: 假设要计算数据0x0123的CRC-16校验码,那么首先需要将它转换为二进制表示,即0000 0001 0010 0011。 然后需要对其进行填充,即在末尾填充16个0,得到0000 0001 0010 0011 0000 0000 0000 0000。 接着,将填充后的数据与初始值0xFFFF进行异或操作,得到初始值为1111 1111 1111 1110。 接下来,依次将每个数据位与初始值的高位进行异或操作。第一位是0,所以将初始值左移一位得到1111 1111 1111 1100。第二位是0,同样左移得到1111 1111 1110 0000。第三位是1,左移得到1111 1110 1100 0001。最后一位是1,左移得到1110 1111 0000 0010。 所有数据位处理完毕后,得到的结果为1110 1111 0000 0010,即0xEF02,这就是CRC-16校验码。 注意:这里的计算方法是按照大端方式进行的,即高位在前,低位在后。如果是小端方式,则需要先将数据字节序倒置再进行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值