目次
1. CRC16/Modbus チェックサムとは何ですか
CRC16/Modbus チェックは、デバイス通信中にデータ フレームの整合性を検証できるため、誤ったデータを回避できます。主にModbus通信プロトコルなどで広く使われており、同様の検証方法はサム検証など多数ありますが、ここでは主にCRC16検証について説明します。
2. CRC16/Modbus検証の計算手順
CRC16 チェックの計算手順は次のとおりです。
- 16 ビット レジスタに 0xFFFF の値をプリセットします。これを CRC レジスタと呼びます。
・データを各ビットずつ取り出し、CRCレジスタの下位8ビットとXOR演算を行い、その結果をCRCレジスタに代入します。
- CRC レジスタの値を右に 1 ビットシフトします。
- シフトされたビットを判断し、0 の場合は次のバイトに進みます。
- シフトアウトされたビットが 1 の場合、CRC レジスタと 0xA001 の XOR を計算し、結果を CRC レジスタに割り当てます。
- 右シフトが 8 回、つまり 1 バイトが処理されるまで、上記の手順を繰り返します。
- ステップ 2 を繰り返して、すべてのバイトを処理します。
- CRC レジスタの上位バイトと下位バイトを交換して、最終チェック コードを取得します。
3. CRC16/Modbus検証のC言語実装
CRC16/Modbus検証のC言語実装方法は、ルックアップテーブル方式と計算方式に分かれます。計算方法は基本公式の原則に基づいており、必要なときに書き出すことができるため、最初に推奨されます。この記事ではアルゴリズム コードも提供します。
uint8 reply[]={0xfe,0x01,0x04,0x00,0x00,0x01,0x00,0x4e,0xf5};
void crc()
{
int cs = 0xffff;
for (int i = 0; i < 7; i++)
{
cs ^= reply[i];
for (int j = 0; j < 8; j++)
{
if (cs & 1 == 1)
{
cs >>= 1;
cs ^= 0xa001;
}
else
{
cs >>= 1;
}
}
}
reply[7] = cs & 0xff; // 校验码的低字节
reply[8] = (cs & 0xff00) >> 8; // 校验码的高字节
};