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の順で送ります。不一致の調査ではバイト順も確認してください。