CRC-16/MODBUS的高低位之说

  MODBUS的CRC校验过程为:
  1.预置1个16位的寄存器为0xFFFF(即全为1),称此寄存器为CRC寄存器;
  2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与CRC寄存器的低8位相异或,把结果赋值给CRC寄存器;
  3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
  4.如果移出位为0:重复第3步(再次右移一位); 如果移出位为1:CRC寄存器与0xA001(1010 0000 0000 0001)进行异或,结果赋值给CRC寄存器;
  5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
  6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
  7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
  8.最后得到的CRC寄存器内容即为:CRC码。
  之所以有高低位之说,是因为有的程序没有做步骤7,有的程序做了步骤7。
  下面是Java实现的一个CRC校验码生成代码:

private String GetCRC( byte[] frame ) {
    int CRC = 0x0000ffff;
    int POLYNOMIAL = 0x0000a001;
    int i, j;
    for (i = 0; i < frame.length; i++) {
        CRC ^= ((int) frame[i] & 0x000000ff);
        for (j = 0; j < 8; j++) {
            if ((CRC & 0x00000001) != 0) {
                CRC >>= 1;
                CRC ^= POLYNOMIAL;
            } else {
                CRC >>= 1;
            }
        }
    }
    CRC = ( (CRC & 0x0000FF00) >> 8) | ( (CRC & 0x000000FF ) << 8); //转换高低位
    return Integer.toHexString(CRC);
}

  这是一个在线CRC校验码生成工具,生成的校验码就是没有做步骤7的,需要自己转换一下。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
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校验码。 注意:这里的计算方法是按照大端方式进行的,即高在前,低在后。如果是小端方式,则需要先将数据字节序倒置再进行计算。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值