>PSBさんが指摘してくれましたcrc16_get()という関数が
>明確に見つけられなかったのですが、それらしき場所の
>ソースは以下のようになっています。
crc16_get()は提示したソースの最後にありますね。
>「>>」はビット演算子の右シフトですよね。
>でも「^」これはビット演算子の排他的論理輪ではないのでしょうか?
>>は右シフトで、^は排他的論理和でいいです。
ただ、CRC演算部分はそのまま使えるので、このソースを解析する
必要は無く、最初に提示したソースをどのように利用するかが重要なのでは
ないでしょうか。
#むろん、時間があれば解析すれば勉強になります。
最初のソースにおおよそのコメントを入れてみました。
この流れでデータ送信を行えば、いいと思いますが。
rs_putc( SC_DLE ); /* DLE送信 */
rs_putc( SC_STX ); /* STX送信 */
ch = Snd.bno & 0xff; /* bnoの下位1バイトを取り出し */
if( ch == SC_DLE ){
rs_putc( SC_DLE );
}
rs_putc((unsigned char)ch ); /* bno送信 */
ch = ~ch; /* bnoのビット反転 */
if( ch == SC_DLE ){
rs_putc( SC_DLE );
}
rs_putc((unsigned char)ch ); /* bnoの補数送信 */
crc16_begin(); /* CRC演算開始 */
Snd.cp = Snd.rp;
for( i = 0;( i < 256 )&&( Snd.cp < Snd.wp );i++ ){
ch = Snd.buf[Snd.cp]; /* テキスト取り出し */
if( ch == SC_DLE ){
if( i == 255 ){
break;
}
rs_putc( SC_DLE );
i++;
}
crc16_calc((byte)ch); /* CRC演算 */
rs_putc((unsigned char)ch ); /* テキスト送信 */
Snd.cp++; /* インデックス更新 */
}
rs_putc( SC_DLE ); /* DEL送信 */
rs_putc( SC_ETX ); /* ETX送信 */
crc = crc16_get(); /* CRC取得 */
rs_putc((unsigned char)(( crc >> 8 ) & 0xff)); /* CRC上位8ビット送信 */
rs_putc((unsigned char)(crc & 0xff)); /* CRC下位8ビット送信 */
|