November 07, 20077bits エンコーダ/デコーダ最近、以前PC接続用基板を作ったXBeeを用いて、シリアル通信(より正確にはUART)をしていますが、少し困ったことがありました。当然やり取りされるデータは1byte単位なので、複数バイトで意味を持つような通信はちょっとした工夫をしないと、どこのバイトからどこのバイトが一つの意味単位を構成しているのかが不明になってしまいます。そこで今回はその工夫、題して7bits エンコーダ/デコーダについて記そうと思います。 複数バイトで一つの意味を表すための工夫としてはいくつかの方法が考えられますが、今回は各バイトの先頭1bitを情報開始フラグとして利用することにしました。つまり先頭のバイトではそのフラグを落とし残り7bitsで情報を表す、例えば2進表記で0b0XXXXXXXのようにします。以降のバイトについてはそのフラグを立てて0b1XXXXXXXとし、同じく残り7bitsで情報を表すことにします。これでどこから意味単位が始まるのか簡単に把握できます。 ここで問題になるのが7bitsで情報を表す、ということです。1byte=8bitsなのでどう考えても7bitsでは情報量が不足します。そこで7+1に分けて、7bitsについては先頭のバイトに格納し、残り1bitについては次のバイトと混ぜて7+2にし、その7bitsについては2番目のバイトに格納し、 これをC言語でサクッと実装してみました。bits7.cとbits7.hです。u8 = unsigned charなので必要に応じてtypedefしてください。またテストコードをつけてあります。実行するには#define BITS7_TEST_MODEしてコンパイルしてみてください。 ちなみにですが先ほどの先頭1bitをフラグにする通信方式を利用すると、XBeeでは非常にいいことがありまして、"+++"(+を3文字分)でコマンドモード(GPIOの操作やAD変換値の取得などXBeeがもつ機能へのアクセスモード)に移行してしまうことを抑制できます。ASCII文字で表されてしまうのは先頭の一文字だけですので、複数バイトでやり取りをしている限りは'+'の文字が3個続くことはありません。 コメント
車輪の再発明とおっしゃっているのを承知で書き込みます。バイト単位の通信の場合、簡単な方法として情報パケットの先頭に"STX"文字を置くというものがあります。で、情報自体の中に"STX"と同じワードが現れたら、"ESC"+"S"にするといった置き換えをします。この場合、オーバーヘッドは1/128になります。 Posted by: 酔漢 : November 8, 2007 10:02 AMあ、1/256 + パケットヘッダか。 Posted by: 酔漢 : November 8, 2007 10:04 AM>酔漢さん コメントする
|
スポンサード リンク
|