CRCを計算しても一致しません・・・

解決


こうちゃ  2005-06-10 03:47:22  No: 57800

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/
から頂きました。

よろしくお願いします。


こうちゃ  2005-06-10 06:02:59  No: 57801

間違えました。。。

データは
<<ヘッダ3byteは削除
11 02 00 10 82 C4 82 B7 82 C6 2E 70 6E
67 00 03 
です
00 00   <<CRCの部分は00で埋める  は間違いです


こうちゃ  2005-06-11 18:25:53  No: 57802

自己解決しました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加