組み込み通信

CRC計算(Modbus CRC-16)

Modbus RTUは末尾にCRCの2バイトを付けます。受信側も同じ計算を行い、一致しないフレームを破棄します。

Modbus CRC-16の計算器

1. 16進数のバイト列を入力

2. 計算を進める

バイトのXORと8回のシフトを順に進めます。赤枠は次に押し出すビットです。

計算規則

0xFFFFで初期化し、各バイトを下位8ビットへXORします。8回右シフトし、押し出したビットが1なら0xA001とXORします。

crc = 0xFFFF
for 各バイトb:
    crc ^= b
    8回繰り返す:
        if crc & 1:  crc = (crc >> 1) ^ 0xA001
        else:        crc = crc >> 1

0xA001は多項式0x8005のビット反転表現です。下位ビットから処理するため反転形を使います。

送信は下位バイトから

CRC値が0xCDC5ならC5 CDの順で送ります。不一致の調査ではバイト順も確認してください。