Modbus crc16校验

1 篇文章 0 订阅

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 码。

补充:
多项式产生:
如x16+x12+x5+1
x16表示第16位为1,x5表示第5位为1
(1 << 16) | (1 << 12) | (1 << 5) | (1) = 0x11021
但是CRC16只取低16位,写成16进制数就是 0x1021

// Modbus crc16
unsigned short crc16 ( unsigned char *Array,  unsigned int Len )
{
    unsigned int  IX, IY, CRC;
    unsigned char Rcvbuf[2] = { 0 };

    if ( Len <= 0 )
        return 0;


    CRC = 0xFFFF;
    for ( IX = 0; IX < Len; IX++ )		//需要处理的数据
    {
        CRC = CRC ^ ( unsigned int ) ( Array[IX] );
        for ( IY = 0; IY <= 7; IY++ )	// 处理1个字节
        {
            if ( ( CRC & 1 ) != 0 )
                CRC = ( CRC >> 1 ) ^ 0xA001;
            else
                CRC = CRC >> 1; 
        }
    }

    Rcvbuf[0] = ( CRC & 0xff00 ) >> 8; 	//高位
    Rcvbuf[1] = ( CRC & 0x00ff ); 		//低位

    CRC  = Rcvbuf[0] << 8;
    CRC += Rcvbuf[1];

    return CRC;
}

参考:https://blog.csdn.net/u013625451/article/details/81239572?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值