プロが教えるわが家の防犯対策術!

以下のようなハード環境とプログラムで、マイコンの変数値を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、書籍)がありましたら、合せてご紹介をお願いいたします。

A 回答 (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文字に変換する処理とか、データの始めと終りを何にするかの取り決めなどの事)を決めたのであれば、その「約束事」に添った受信プログラムが必要になります。

「約束事は自分で決めた」のですから、その「自分だけの約束事」に添った受信をするプログラムは自作するしかありません。

パソコンで受信プログラムを自作するのは難しいでしょうから、データをハイパーターミナルで受信して、ログをファイルに保存してください。

保存したログファイルを読み込んで、元のデータに戻して、数字を読める状態で表示するだけのプログラムなら、そう難しくはない筈です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/20 22:12

一つの方法はテキストにエンコードする。


現在Webで使ってる Base64ではなく 16進数にして一行 40バイト分くらいづつ送る。
TCP/IPと違って転送に信頼性が無いから
checksum CRC等入れると良い。
具体的には
http://www.starlet.co.jp/column/hexfile.htm



XMODEMを使う。
簡単なバイナリ-転送のプロトコルがあります。
エラーリトライをするので転送成功率が上がります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/20 22:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!