艾巴生活网

您现在的位置是:主页>科技 >内容

科技

crc校验码计算代码c语言_crc16几种标准校验算法及c语言代码

2024-01-21 19:02:01科技帅气的蚂蚁
一、 CRC-16校验码的使用现在选择最常用的CRC-16校验码,并说明其使用方法。根据Modbus协议,常规485通信的信息传输形式如下:地址功能码

crc校验码计算代码c语言_crc16几种标准校验算法及c语言代码

一、 CRC-16校验码的使用现在选择最常用的CRC-16校验码,并说明其使用方法。

根据Modbus协议,常规485通信的信息传输形式如下:

地址功能码数据信息校验码

1字节1字节2字节

CRC校验是前面几段数据的校验值,是一个16位的数据。发送时,低8位在前,高8位在后。

例如,信息字段代码为:1011001,验证字段为:1

发送方:发送的传输字段为:1 0 1 1 0 1 0 1 0 10。

信息字段检查字段

接收方:使用相同的计算方法计算信息字段的校验码,并与实际收到的校验码进行比较。如果相等,信息正确,如果不相等,信息错误;或者把接收到的信息全部用多项式除,如果能整除,信息就是正确的。

二、CRC16校验码计算方法常用查表法和计算法。计算方法一般是:

(1)预置一个16位寄存器为十六进制FFFF(即全1),调用这个寄存器CRC

(2)、第一个8位二进制数据(即通信信息帧的第一个字节)和16位CRC寄存器的低位

8位异或,将结果放入CRC寄存器,数据的高八位不变;

(3)将CRC寄存器的内容右移一位(向低位),最高位填充0,右移后检查移出的位;

(4)如果移出位为0:重复步骤3(再次右移一位);如果移出位为1,则CRC寄存器等于many。

异或项A001(101000000000001);

(5)重复步骤3和4,直到它向右移动8次,这样所有的8位数据都被处理;

(6)重复步骤2至5以处理通信信息帧的下一个字节;

(7)按照上述步骤计算完通信信息帧的所有字节后,得到16位CRC寄存器的高低。

字节被交换;

(8)最后的CRC寄存器内容是:CRC码。

以上计算步骤中的多项式A001是8005逐位求逆的结果。

查表法是将移位异或的计算结果制成表格,即将0~256放入一个16位寄存器的低八位,高八位用0填充。然后按照上面的步骤3、4直到8位全部去掉,最后寄存器中的值就是表中的数据,高8位和低8位分别列出。

:几种常见标准的三、CRC16算法常见的标准有以下几种,在各种规范中都有使用,它们的算法原理基本相同,就是数据输入输出有区别。这里列举了这些标准的区别,并给出了C语言的算法实现。

CRC16_CCITT:多项式x16 x12 x5 1(0x1021),初始值为0x0000,低位在前,高位在后,结果与0x0000异或。

CRC16_CCITT_FALSE:多项式x16 x12 x5 1(0x1021),初始值0xFFFF,低位最后,高位先,结果与0x0000异或。

CRC16_XMODEM:多项式x16 x12 x5 1(0x1021),初始值0x0000,低位最后,高位先,结果与0x0000异或。

CRC16_X25:多项式x16 x12 x5 1(0x1021),初始值0x0000,低位优先,高位最后,结果与0xFFFF异或。

CRC16_MODBUS:多项式x16 x15 x5 1(0x8005),初始值0xFFFF,低位优先,高位最后,结果与0x0000异或。

CRC16_IBM:多项式x16 x15 x5 1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或。

CRC16_MAXIM:多项式x16 x15 x5 1(0x8005),初始值0x0000,低位优先,高位最后,结果与0xFFFF异或。

CRC16_USB:多项式x16 x15 x5 1(0x8005),初始值0xFFFF,低位先,高位后,结果与0xFFFF异或。

四、 CRC 16 1的算法原理及程序。根据CRC 16的标准选择CRCIn的初始值。

2.将数据的第一个字节与CRCIn的高8位进行异或运算。

3.判断最高位。如果是0,则左移一位;如果为1,则将其左移一位,然后与多项式十六进制码进行异或运算。

4.重复3,直到完成所有8位移位计算。

5.对所有输入数据操作重复上述步骤,以获得16位CRC校验码。

根据算法原理与标准要求就能简单的写出具体程序:

[cpp]查看普通副本无符号短CRC 16 _ CCITT(无符号char * puch msg,无符号int usDataLen)

{

无符号短整型wCRCin=0x0000

无符号短整型wCPoly=0x1021

无符号字符wChar=0;

while (usDataLen -)

{

wChar=*(puchMsg);

InvertUint8(wChar,wChar);

WCR^=(wchar《8》CIN);

for(int I=0;我《8;我)

{

if(wCRCin0x8000)

^ wcpoly CIN=(WCR CIN《1》);

其他

WCRCIN=WCRCIN《1;

}

}

InvertUint16(wCRCin,WCR CIN);

返回(WCRCIN);

}

无符号短整型CRC16_CCITT_FALSE(无符号char *puchMsg,无符号国际美元数据)

{

无符号短整型wCRCin=0xFFFF

无符号短整型wCPoly=0x1021

无符号字符wChar=0;

while (usDataLen -)

{

wChar=*(puchMsg);

WCR^=(wchar《8》CIN);

for(int I=0;我《8;我)

{

if(wCRCin0x8000)

^ wcpoly CIN=(WCR CIN《1》);

其他

WCRCIN=WCRCIN《1;

}

}

返回(WCRCIN);

}

无符号短整型CRC16_XMODEM(无符号char *puchMsg,无符号国际美元数据)

{

无符号短整型wCRCin=0x0000

无符号短整型wCPoly=0x1021

无符号字符wChar=0;

while (usDataLen -)

{

wChar=*(puchMsg);

WCR^=(wchar《8》CIN);

for(int I=0;我《8;我)

{

if(wCRCin0x8000)

^ wcpoly CIN=(WCR CIN《1》);

其他

WCRCIN=WCRCIN《1;

}

}

返回(WCRCIN);

}

无符号短整型CRC16_X25(无符号char *puchMsg,无符号国际美元数据)

{

无符号短整型wCRCin=0xFFFF

无符号短整型wCPoly=0x1021

无符号字符wChar=0;

while (usDataLen -)

{

wChar=*(puchMsg);

InvertUint8(wChar,wChar);

WCR^=(wchar《8》CIN);

for(int I=0;我《8;我)

{

if(wCRCin0x8000)

^ wcpoly CIN=(WCR CIN《1》);

其他

WCRCIN=WCRCIN《1;

}

}

InvertUint16(wCRCin,WCR CIN);

返回(wcrcin^0xffff);

}

无符号短整型CRC16_MODBUS(无符号char *puchMsg,无符号国际美元数据)

{

无符号短整型wCRCin=0xFFFF

无符号短wCPoly=0x8005

无符号字符wChar=0;

while (usDataLen -)

{

wChar=*(puchMsg);

InvertUint8(wChar,wChar);

WCR^=(wchar《8》CIN);

for(int I=0;我《8;我)

{

if(wCRCin0x8000)

^ wcpoly CIN=(WCR CIN《1》);

其他

WCRCIN=WCRCIN《1;

}

}

InvertUint16(wCRCin,WCR CIN);

返回(WCRCIN);

}

无符号短整型CRC16_IBM(无符号char *puchMsg,无符号国际美元数据)

{

无符号短整型wCRCin=0x0000

无符号短wCPoly=0x8005

无符号字符wChar=0;

while (usDataLen -)

{

wChar=*(puchMsg);

InvertUint8(wChar,wChar);

WCR^=(wchar《8》CIN);

for(int I=0;我《8;我)

{

if(wCRCin0x8000)

^ wcpoly CIN=(WCR CIN《1》);

其他

WCRCIN=WCRCIN《1;

}

}

InvertUint16(wCRCin,WCR CIN);

返回(WCRCIN);

}

无符号短整型CRC16_MAXIM(无符号char *puchMsg,无符号国际美元数据)

{

无符号短整型wCRCin=0x0000

无符号短wCPoly=0x8005

无符号字符wChar=0;

while (usDataLen -)

{

wChar=*(puchMsg);

InvertUint8(wChar,wChar);

WCR^=(wchar《8》CIN);

for(int I=0;我《8;我)

{

if(wCRCin0x8000)

^ wcpoly CIN=(WCR CIN《1》);

其他

WCRCIN=WCRCIN《1;

}

}

InvertUint16(wCRCin,WCR CIN);

返回(wcrcin^0xffff);

}

无符号短整型CRC16_USB(无符号char *puchMsg,无符号国际美元数据)

{

无符号短整型wCRCin=0xFFFF

无符号短wCPoly=0x8005

无符号字符wChar=0;

while (usDataLen -)

{

wChar=*(puchMsg);

InvertUint8(wChar,wChar);

WCR^=(wchar《8》CIN);

for(int I=0;我《8;我)

{

if(wCRCin0x8000)

^ wcpoly CIN=(WCR CIN《1》);

其他

WCRCIN=WCRCIN《1;

}

}

InvertUint16(wCRCin,WCR CIN);

返回(wcrcin^0xffff);

}