modbusの仕様を読んでいてCRCの計算方法がよくわかなかったのでC言語のソースコードを上げておきたいと思います。
この手の計算処理はフローチャートは文章で説明されてもよくわからないことが多く、いつもソースくれ!って思います。
// buf 受信データ // length 受信データ長(CRCを除く) unsigned short calc_crc(unsigned char *buf, int length) { unsigned short crc = 0xFFFF; int i,j; unsigned char carrayFlag; for (i = 0; i < length; i++) { crc ^= buf[i]; for (j = 0; j < 8; j++) { carrayFlag = crc & 1; crc = crc >> 1; if (carrayFlag) { crc ^= 0xA001; } } } return crc; }
ちなみにmodbus RTUは電文には開始コード・終了コードがなく、電文の開始と終了には3.5文字分の無通信時間が必要です。
真面目に実装する場合、タイマーを使って状態遷移しないといけないのがちょっと面倒ですね。