C初心者です(^^ゞ
現在、ある端末とシリアル通信を行うソフトを作成中です。
端末がデータブロックの後ろにCRCを2バイトくっつけて
送ってくるのですが、こちらで計算した結果と送ってきた結果が
異なるため、困っています。。。
サンプルをのせますのでわかる方がいらっしゃいましたら
教えてください
[端末から送られてくるデータ]
(前3byteはヘッダだとおもいます 後ろの2バイトがCRCだと思います)
01 00 00 11 02 00 10 82 C4 82 B7 82 C6 2E 70 6E
67 00 03 FA 9E
上の例だと、CRCはFA9Eになるはずですが、自分で計算したところ、
0x4871 がCRCとして出力されてきてしまいます。。。
データは
<<ヘッダ3byteは削除
11 02 00 10 82 C4 82 B7 82 C6 2E 70 6E
67 00 03 00 00 <<CRCの部分は00で埋める
計算には以下のソースを使用しています。
CRC-16・CCITT-16両方やってみましたが一致しませんでした。。。
/***********************************************************
crc16.c -- CRC
***********************************************************/
#include <limits.h>
#define CRCPOLY1 0x1021 /* x^{16}+x^{12}+x^5+1 */
#define CRCPOLY2 0x8408 /* x16+x15+x2+x1+1 左右逆転 */
unsigned int crc1(int n, unsigned char *c)
{
unsigned int i, j, r;
r = 0xFFFF;
for (i = 0; i < n; i++) {
r ^= (unsigned int)c[i] << (16 - CHAR_BIT);
for (j = 0; j < CHAR_BIT; j++)
if (r & 0x8000) r = (r << 1) ^ CRCPOLY1;
else r <<= 1;
}
return ~r & 0xFFFF;
}
unsigned int crc2(int n, unsigned char *c)
{
unsigned int i, j, r;
r = 0xFFFF;
for (i = 0; i < n; i++) {
r ^= c[i];
for (j = 0; j < CHAR_BIT; j++)
if (r & 1) r = (r >> 1) ^ CRCPOLY2;
else r >>= 1;
}
return r ^ 0xFFFF;
}
ちなみに上記ソースは
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms/
から頂きました。
よろしくお願いします。
間違えました。。。
データは
<<ヘッダ3byteは削除
11 02 00 10 82 C4 82 B7 82 C6 2E 70 6E
67 00 03
です
00 00 <<CRCの部分は00で埋める は間違いです
自己解決しました
ツイート | ![]() |