CRCコードは送信側によって計算され、送信されたメッセージの末尾に配置される。情報を受信したデバイスは、受信したメッセージのCRCを再計算し、計算されたCRCが受信したCRCと一致するかどうかを比較し、一致しない場合はエラーを示します。
検査符号のはX16 + X15 + X2 + 1である。
CRC16コードの計算方法は以下の通りです。
1. 16ビットのレジスタを16進FFFF(すなわち、すべて1)としてプリセットし、このレジスタをCRCレジスタと呼びます。
最初の8ビットバイナリデータ(通信情報フレームの最初のバイト)を16ビットCRCレジスタの下位8ビットと異なるか、結果をCRCレジスタに格納します。
CRCレジスタの内容を1ビット右(下位)にシフトして最上位ビットを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コードです。
コードコード。
uned int GetCRC16 uned *ptr uned
{
符号なしintインデックス;
unsigned char crch = 0 x FF; //高CRCバイト
unsigned char crcl = 0 x FF; //低CRCバイト
uned code TabH] = { //CRCハイバイト値テーブル
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0
0x80 0x41 0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x00 0xC1
0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x00 0xC1
0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40
0x01 0xC0 0x80 0x41 0x01 0xC0 0x80 0x41 0x00 0xC1
0x81 0x40 0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40
0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0
0x80 0x41 0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x01 0xC0 0x80 0x41 0x00 0xC1 0x81 0x40 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40 0x00 0xC1 0x81 0x40
0x01 0xC0 0x80 0x41 0x01 0xC0 0x80 0x41 0x00 0xC1
0x81 0x40 0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41
0x00 0xC1 0x81 0x40 0x01 0xC0 0x80 0x41 0x01 0xC0
0x80 0x41 0x00 0xC1 0x81 0x40
} ;
unsigned char code TabL] = { //CRC下位バイト値テーブル
0x00 0xC0 0xC1 0x01 0xC3 0x03 0x02 0xC2 0xC6 0x06
0x07 0xC7 0x05 0xC5 0xC4 0x04 0xCC 0x0C 0x0D 0xCD
0 x 0 F、0 x CF、0 x CE、0 x 0 E、0 x 0 A、0 x CA、0 x CB、0 x 0 B、0 x C 9、0 x 0 9、
0 x 08、0 x C 8、0 x D 8、0 x 18、0 x 19、0 x D 9、0 x 1 B、0 x DB、0 x DA、0 x 1 A、
0x1E 0xDE 0xDF 0x1F 0xDD 0x1D 0x1C 0xDC 0x14 0xD4
0xD5 0x15 0xD7 0x17 0x16 0xD6 0xD2 0x12 0x13 0xD3
0x11 0xD1 0xD0 0x10 0xF0 0x30 0x31 0xF1 0x33 0xF3
0xF2 0x32 0x36 0xF6 0xF7 0x37 0xF5 0x35 0x34 0xF4
0x3C 0xFC 0xFD 0x3D 0xFF 0x3F 0x3E 0xFE 0xFA 0x3A
0 x 3 B、0 x FB、0 x 39、0 x F 9、0 x F 8、0 x 38、0 x 28、0 x E 8、0 x E 9、0 x 29、
0x0x2B 0x2A 0xEA 0xEE 0x2E 0x2F 0xEF 0x2D 0
0xEC 0x2C 0xE4 0x24 0x25 0xE5 0x27 0xE7 0xE6 0x26
0x22 0xE2 0xE3 0x23 0xE1 0x21 0x20 0xE0 0xA0 0x60
0x61 0xA1 0x63 0xA3 0xA2 0x62 0x66 0xA6 0xA7 0x67
0xA5 0x65 0x64 0xA4 0x6C 0xAC 0xAD 0x6D 0xAF 0x6F
0 x 6 E、0 x AE、0 x AA、0 x 6 A、0 x 6 B、0 x AB、0 x 69、0 x A 9、0 x A 8、0 x 68、
0 x 78、0 x B 8、0 x B 9、0 x 79、0 x BB、0 x 7 B、0 x 7 A、0 x BA、0 x BE、0 x 7 E
0x7F、0xBF、0x7D、0xBD、0xBC、0x7C、0xB4、0x74、0x75、0xB5、
0x77 0xB7 0xB6 0x76 0x72 0xB2 0xB3 0x73 0xB1 0x71
0 x 70、0 x B 0、0 x 50、0 x 90、0 x 91、0 x 51、0 x 93、0 x 53、0 x 52、0 x 92、
0 x 96、0 x 56、0 x 57、0 x 97、0 x 55、0 x 95、0 x 94、0 x 54、0 x 9 C、0 x 5 C、
0 x 5 D、0 x 9 D、0 x 5 F、0 x 9 F、0 x 9 E、0 x 5 E、0 x 5 A、0 x 9 A、0 x 9 B、0 x 5 B、
0 x 99、0 x 59、0 x 58、0 x 98、0 x 88、0 x 48、0 x 49、0 x 89、0 x 4 B、0 x 8 B、
0x8A 0x4A 0x4E 0x8E 0x8F 0x4F 0x8D 0x4D 0x4C 0x8C
0x44 0x84 0x85 0x45 0x87 0x47 0x46 0x86 0x82 0x42
0x43 0x83 0x41 0x81 0x80 0x40
} ;
while len--//指定された長さのCRCを計算する
{
index == crch ^ *ptr++;
crch = crcl ^ TabH index];
crcl = TabL index];
}
return<< crch8| crcl;
}この関数は、計算されたCRC値を直接返す

5BKqxwgD
555
555
1
1
1
1%2527%2522
QFhPp7Bt
555
1