• 締切済み

マイコンを用いたバイナリー形式での通信の方法

以下のようなハード環境とプログラムで、マイコンの変数値をPCへ取り込む環境(データロガー)を実現しております。ただし、更にデータの取り込み速度を向上させたく考えておりますが、その手段として、”バイナリー形式”での通信が適用できると情報を得ておりますが、具体的な手法が不明です。よろしくご教授をお願いします。 <環境> ・H8マイコン ・RS-232CでPCと接続 ・PCでのデータ取得は、ハイパーターミナルを利用 <プログラム> (1)送信する部分 H8のSCI3を利用して、1文字ずつ送信 以下具体的に作成したプログラムです void sci3_tx(char data){ while (SCI3.SSR.BIT.TDRE==0); SCI3.TDR=data; } (2)実際の送信 "1234"(←千二百三十四)と"3456"(←三千四百五十六)というデータを連続して送信したい場合には、 sci3_tx(1+48); sci3_tx(2+48); sci3_tx(3+48); sci3_tx(4+48); sci3_tx('\r'); sci3_tx('\n'); sci3_tx(3+48); sci3_tx(4+48); sci3_tx(5+48); sci3_tx(6+48); sci3_tx('\r'); sci3_tx('\n'); と処理し、ハイパーターミナルでデータを保存して、"1234"と"3456"を取り出しています。 <ご質問の詳細> (1) 上記のように2つの数値をバイナリー形式で送信するためには、どのように実施したらよいのでしょうか? 例えば、バイナリーの場合2の8乗であるので、 1234を送信する場合、255+255+255+255+214で、11111111、11111111、11111111、11111111、 11010110と送信して、加算処理をすればよろしいでしょうか? (→255を11111111と送信するプログラムもいまいち不明ですが) (2)バイナリー形式で送信する際の送信始め/終わりの区切りはどのように考えたらよろしいでしょうか? (3)バイナリー形式を受信できるソフト(ハイパーターミナルに対応するもの)は、何になりますでしょうか? 以上、いくつかのご質問をさせていただきましたが、参考となる情報(Web、書籍)がありましたら、合せてご紹介をお願いいたします。

みんなの回答

回答No.2

>”バイナリー形式”での通信が適用できると情報を得ております >(1) 上記のように2つの数値をバイナリー形式で送信するためには、どのように実施したらよいのでしょうか? 0~65535のデータは、2バイトで表わせます。 例えば 0=0×256+0 255=0×256+255 256=1×256+0 511=1×256+255 512=2×256+0   | 65535=255×256+255 となります。 つまり「256で割った商」と「256で割った余り」の2バイトにすれば、0~65535の値は「常に2バイト」で済みます。 1234を送るなら sci3_tx(1234 / 256); sci3_tx(1234 % 256); で、3456を送るなら sci3_tx(3456 / 256); sci3_tx(3456 % 256); で済みます。 ただし、このままだと「制御コードとして、特殊な意味がある文字」もデータとして送信してしまうので、送信側で制御コードを送らないように特殊処理をしないとなりません。 例えば void sci3_tx(char data){ if ((data < 0x20) || (data == 0x5e)) { while (SCI3.SSR.BIT.TDRE==0); SCI3.TDR=0x5e; if (data < 0x20) data += 0x40; else data += 0x20; } while (SCI3.SSR.BIT.TDRE==0); SCI3.TDR=data; } など。 こうすると、制御コードは以下のような2文字の通常文字に変換され 0x00⇒^@ 0x01⇒^A 0x02⇒^B  | 0x1A⇒^Z 0x1B⇒^[  | 0x1E⇒^^ 0x1F⇒^_ ^⇒^~ と送られるので、送信データ中に制御コードは出て来ません。 もちろん、受信側では「この逆の処理」をしないと、元のデータに戻りません。 但し、通信は「8ビットデータを送れるもの」でなければなりません。 >(2)バイナリー形式で送信する際の送信始め/終わりの区切りはどのように考えたらよろしいでしょうか? バイナリー形式では「データ中に、すべての文字が現れる可能性がある」ので「受け取った1バイトが、データなのか区切りなのか判らない」です。 つまり、データに始めも終わりもありません。 なので「独自に、送信側と受信側で、データの始めと終りを何にするかの取り決め」をして下さい。 >(3)バイナリー形式を受信できるソフト(ハイパーターミナルに対応するもの)は、何になりますでしょうか? 出来合いの物はありません。自作する必要があります。 「バイナリーデータは、こう送ります」との、独自の約束事(前述の、制御コードを普通の文字2文字に変換する処理とか、データの始めと終りを何にするかの取り決めなどの事)を決めたのであれば、その「約束事」に添った受信プログラムが必要になります。 「約束事は自分で決めた」のですから、その「自分だけの約束事」に添った受信をするプログラムは自作するしかありません。 パソコンで受信プログラムを自作するのは難しいでしょうから、データをハイパーターミナルで受信して、ログをファイルに保存してください。 保存したログファイルを読み込んで、元のデータに戻して、数字を読める状態で表示するだけのプログラムなら、そう難しくはない筈です。

uhpa
質問者

お礼

詳しいご連絡ありがとうございます。 早速、試してみたいと考えております。

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.1

一つの方法はテキストにエンコードする。 現在Webで使ってる Base64ではなく 16進数にして一行 40バイト分くらいづつ送る。 TCP/IPと違って転送に信頼性が無いから checksum CRC等入れると良い。 具体的には http://www.starlet.co.jp/column/hexfile.htm XMODEMを使う。 簡単なバイナリ-転送のプロトコルがあります。 エラーリトライをするので転送成功率が上がります。

uhpa
質問者

お礼

お礼のご回答が遅れ、申し訳ありません。 ご回答いただきました情報をもとに、考察してみます。

関連するQ&A