simotin13's message

simotin13といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

modbus RTUのCRC計算方法(C言語)

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文字分の無通信時間が必要です。
真面目に実装する場合、タイマーを使って状態遷移しないといけないのがちょっと面倒ですね。