掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29228

C言語の基礎とCRC
投稿者---ぴすた(2006/12/13 15:08:17)


はじめまして。現在、シリアル通信する為の送信データの最後に
付けなければならないCRCの算出で困っております。

CRCの算出についてはcrc16で算出の為、予めコードがありました。
//第一引数はデータサイズ、第二はデータそのものです。
unsigned short crc_cal(unsigned short lng, unsigned char* str)
{
  unsigned short crc,i,j;
crc = 0xffff;
for (i=0; i<lng; i++)
{
crc ^= (unsigned short)str[i];
for (j=1; j<=8; j++){
  if (crc & 1)
  { // carry bit on
crc = crc >> 1;
crc ^= 0xa001;
}else{ // carry bit off
crc = crc >> 1;
}
}
}
return (crc);
}

そこで自分としては「ふぅ・・・CRCのロジックがあれば後は問題無いかな・・・」とたかをくくって上記で宣言されているCRC算出の関数に
文字を渡そうと思ったのですが、これが相手の通信機器独特?
のデータらしく、1F 08 00 00 12 34 のCRCを求めたい場合、
いったいどのようにunsigned char*に上記のデータを入れるのかが
かなり調べたのですがわかりません・・・

char *pchTest;
pchTest = (char*)malloc( 13 );
strcpy( pchTest, "1F0800001234" );

または

unsigned char *mori;
mori = (unsigned char*)malloc(13);
strcpy((char*)mori,"1F0800001234");

などという、意味がわからない状態でしか入れる事ができません・・・
そして、上記の値で取得できるはずのCRCは唯一わかっているのですが
(ちなみにEEC2)当然その値も取れません。

そしてCRC算出のコードを見てみると、どうやら一区切り毎のデータの配列で処理して欲しい、という感じがするので1Fをまず計算して、
For分で次は08を計算して・・・となるのが正しいのでは??
と考えているのですが、そういう入れ方もわからずです・・・
(1を計算してFを計算して、という形では無さそうなのです・・・)

かなり基礎的な部分なのだろう、と言う感じはするのですが
今まで触れた事の無い分野ですのでいくら調べても・・・という状況です。

上記のようなシリアル通信の送信データ形式、または引数への指定の仕方等についてご存知でしたら、是非ともよろしくお願い致します。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:C言語の基礎とCRC 29229 keichan 2006/12/13 15:34:35
<子記事> Re:C言語の基礎とCRC 29230 CRC 2006/12/13 15:44:23


No.29229

Re:C言語の基礎とCRC
投稿者---keichan(2006/12/13 15:34:35)


"文字列"を渡すのではなく、配列の先頭アドレスをunsigned char*へキャストして渡すのではないですか?
例)今回のデータはunsigned char配列なのでキャストはしていない
unsigned char crc[6] = {1F,08,00,00,12,34};
unsigned short crc_ret = crc_cal(6, crc);


この投稿にコメントする

削除パスワード

No.29231

Re:C言語の基礎とCRC
投稿者---ぴすた(2006/12/13 15:49:12)


>"文字列"を渡すのではなく、配列の先頭アドレスをunsigned char*へキャストして渡すのではないですか?
>例)今回のデータはunsigned char配列なのでキャストはしていない
>unsigned char crc[6] = {1F,08,00,00,12,34};
>unsigned short crc_ret = crc_cal(6, crc);

keichan様

早速のご回答、大変ありがとうございます。
ものすごく基礎的な部分だとは認識はできていたのですが
何をどうやっても渡せなかったので(これだけに3日間くらい
費やしてました・・・)
ご回答の例を参考にした結果、配列に挿入時に0xを付与して
代入し、関数の引数へ渡した結果、無事c2eeが取得できました!
(なぜ逆なのかはなんとか自分で頑張ります!)
ありがとうございました。



この投稿にコメントする

削除パスワード

No.29230

Re:C言語の基礎とCRC
投稿者---CRC(2006/12/13 15:44:23)


#include <stdio.h>

unsigned short crc_cal(unsigned short lng, unsigned char *str)
{
    unsigned short crc, i, j;
    
    crc = 0xffff;
    for (i = 0; i < lng; i++) {
        crc ^= (unsigned short) str[i];
        for (j = 1; j <= 8; j++) {
            if (crc & 1) {        // carry bit on

                crc = crc >> 1;
                crc ^= 0xa001;
            }
            else {            // carry bit off

                crc = crc >> 1;
            }
        }
    }
    return crc;
}

int main(void)
{
    unsigned char str[] = { 0x1F, 0x08, 0x00, 0x00, 0x12, 0x34 };
    unsigned short crc;
    
    crc = crc_cal(sizeof(str)/sizeof(str[0]), str);
    printf("crc=%d(%X)\n", crc, crc);
    return 0;
}



このコードで実験したらC2EEという、
バイトが逆の値を得ました。



この投稿にコメントする

削除パスワード

No.29232

Re:C言語の基礎とCRC
投稿者---ぴすた(2006/12/13 15:51:04)


><pre>#include <stdio.h>

unsigned short crc_cal(unsigned short lng, unsigned char *str)
{
unsigned short crc, i, j;

crc = 0xffff;
for (i = 0; i < lng; i++) {
crc ^= (unsigned short) str[i];
for (j = 1; j <= 8; j++) {
if (crc & 1) { <font color="#009900">// carry bit on
</font>
crc = crc >> 1;
crc ^= 0xa001;
}
else { <font color="#009900">// carry bit off
</font>
crc = crc >> 1;
}
}
}
return crc;
}

int main(void)
{
unsigned char str[] = { 0x1F, 0x08, 0x00, 0x00, 0x12, 0x34 };
unsigned short crc;

crc = crc_cal(sizeof(str)/sizeof(str[0]), str);
printf(<font color="#0000ff">"crc=%d(%X)\n"</font>, crc, crc);
return 0;
}

</pre>
>
>このコードで実験したらC2EEという、
>バイトが逆の値を得ました。

CRCさん、ご回答ありがとうございます。
私も今さっき逆のC2EEという値が取得できました。
本当に基礎的な部分で情けないです・・・勉強します・・・
ありがとうございました!



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧