CRC 16校驗原理

2021-07-25 15:19:08 字數 3497 閱讀 9427

1

、迴圈校驗碼(

crc碼):

是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。

2

、生成crc

碼的基本原理:

任意乙個由二進位制位串組成的**都可以和乙個係數僅為

『0』和

『1』取值的多項式一一對應。例如:**

1010111

對應的多項式為x6

+x4+x2

+x+1

,而多項式為x5

+x3+x2

+x+1

對應的**

101111。

標準crc

生成多項式如下表: 名稱

生成多項式

簡記式*

標準引用

crc-4

x4+x+1 3

itu g.704

crc-8

x8+x5+x4+1

0x31 

crc-8

x8+x2+x1+1

0x07

crc-8

x8+x6+x4+x3+x2+x1

0x5e

crc-12

x12+x11+x3+x+1

80fcrc-16

x16+x15+x2+1

8005

ibm sdlc

crc16-ccitt

x16+x12+x5+1

1021

iso hdlc, itu x.25,

,v.34/v.41/v.42, ppp-fcs

crc-32

x32+x26+x23+...+x2+x+1

04c11db7

zip, rar, ieee 802 lan/fddi, ieee 1394, ppp-fcs

crc-32c

x32+x28+x27+...+x8+x6+1

1edc6f41

sctp

3

、crc-16

校驗碼的使用:

現選擇最常用的

crc-16

校驗,說明它的使用方法。

根據

modbus

協議,常規

485

通訊的資訊傳送形式如下:

位址功能碼

資料資訊

校驗碼1byte 

1byte 

nbyte 

2byte 

crc校驗是前面幾段資料內容的校驗值,為乙個

16位資料,傳送時,低

8位在前,高

8為最後。

例如:資訊字段**為

: 1011001

,校驗欄位為:

1010。

傳送方:發出的傳輸欄位為

:1 0 1 1 0 0 1 1 0 10

資訊字段

校驗字段

接收方:使用相同的計算方法計算出資訊欄位的校驗碼,對比接收到的實際校驗碼,如果相等及資訊正確,不相等則資訊錯誤;或者將接受到的所有資訊除多項式,如果能夠除盡,則資訊正確。

4

、crc-16

校驗碼計算方法:

常用查表法和計算法。計算方法一般都是:(1

)、預置1個

16位的暫存器為十六進製制

ffff

(即全為

1),稱此暫存器為

crc暫存器;(2

)、把第乙個

8位二進位制資料(既通訊資訊幀的第乙個位元組)與

16位的

crc暫存器的低

8位相異或,把結果放於

crc暫存器,高八位資料不變;(3

)、把crc

暫存器的內容右移一位(朝低位)用

0填補最高位,並檢查右移後的移出位;(4

)、如果移出位為

0:重複第

3步(再次右移一位);如果移出位為1,

crc暫存器與多

項式a001

(1010 0000 0000 0001

)進行異或;(5

)、重複步驟3和

4,直到右移

8次,這樣整個

8位資料全部進行了處理;(6

)、重複步驟

2到步驟

5,進行通訊資訊幀下乙個位元組的處理;(7

)、將該通訊資訊幀所有位元組按上述步驟計算完成後,得到的16位

crc暫存器的高、低

位元組進行交換;(8

)、最後得到的

crc暫存器內容即為:

crc碼。

以上計算步驟中的多項式

a001

是8005

按位顛倒後的結果。

查表法是將移位異或的計算結果做成了乙個表,就是將

0~256

放入乙個長度為

16位的暫存器中的低八位,高八位填充

0,然後將該暫存器與多項式

0xa001

按照上述3、

4步驟,直到八位全部移出,最後暫存器中的值就是**中的資料,高八位、低八位分別單獨乙個表。

5

、經典的程式示例(驗證通過)

方法一:

c

查表法版本:

特點:速度快,語句少,但**占用一定的程式空間。

*pucframe

為待校驗資料首位址,

uslen

為待校驗資料長度。返回值為校驗結果。

ushort usmbcrc16( uchar * pucframe, ushort uslen )

return ( ushort )( uccrchi << 8 | uccrclo ); }

static const uchar auccrchi = ;

static const uchar auccrclo = ;

方法二: 直接計算

void getcrc(unsigned char *cmmbuf, unsigned char len)

else

}j++;

}cmmbuf[j] = crc % 0x100; //校驗和從長度算起,長度為長度減3

cmmbuf[j + 1] = crc / 0x100;

}

碼crc校驗 CRC16校驗計算流程

首先再次確認計算步驟 1 預置1個16位的暫存器為十六進製制ffff 即全為1111 1111 1111 1111 稱此暫存器為crc暫存器 2 把第乙個位轉換成8位二進位制資料 既通訊資訊幀的第乙個位元組 與16位的crc暫存器的低8位相異或,把結果放於crc暫存器,高八位資料不變 3 把crc暫...

CRC16校驗的學習

一般一些工業上儀器儀表都會選擇crc16校驗,而寫程式對幀資料的校驗也需要選擇crc16校驗看看對不對。所以選擇crc16校驗還是很有必要的。當然crc是2位元組的,具體儲存方式大端儲存還是小端儲存,不同機器不一樣。crc的初值也可能不一樣有的是0x0000,而有的又卻是0xffff具體怎麼選還有根...

CRC16迴圈冗餘校驗

原理 crc 16校驗碼計算方法 常用查表法和計算法。計算方法一般都是 1 預置1個16位的暫存器為十六進製制ffff 即全為1 稱此暫存器為crc暫存器 2 把第乙個8位二進位制資料 既通訊資訊幀的第乙個位元組 與16位的crc暫存器的低 8位相異或,把結果放於crc暫存器,高八位資料不變 3 把...