Modbus RTU中对CRC16校验的步骤

2026-02-05 09:59:59

1、假定需要检验的数据存放在数组Data[n]中,

2、预置16位寄存器为FFFFH,称此寄存器为CRC寄存器;即可定义CRC=16#FFFF

3、把Data[0]与CRC寄存器的低位相异或,把结果放于CRC寄存器;即CRC=CRC XOR Data[0]

4、把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;

 如果最低位为0:重复上一步(再次移位)如果最低位为1:CRC寄存器与多项式A001进行异或;

5、重复上一步,直到右移8次,这样整个8位数据全部进行了处理;

6、重复步骤3到步骤5,进行下一个8位数据的处理

7、最后得到的CRC寄存器即为CRC码

8、void crc16(unsigned char *p,unsigned int len)

{

  unsigned long wcrc=0XFFFF;//16位crc寄存器预置

  unsigned char temp;

  int i=0,j=0;//计数

  for(i=0;i<len;i++)//循环计算每个数据

  {

    temp=*p&0X00FF;//将八位数据与crc寄存器亦或

    p++;//指针地址增加,指向下个数据

    wcrc^=temp;//将数据存入crc寄存器

    for(j=0;j<8;j++)//循环计算数据的

    {

      if(wcrc&0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。

      {

        wcrc>>=1;//先将数据右移一位

        wcrc^=0XA001;//与上面的多项式进行异或

      }

      else//如果不是1,则直接移出

      {

        wcrc>>=1;//直接移出

      }

    }

  }

temp=wcrc;//crc的值

9、Temp中即存放了CRC的高八位和低八位

unsigned char CRC[2];//定义数组

CRC[0]=wcrc;//crc的低八位

CRC[1]=wcrc>>8;//crc的高八位

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢