以下のようなハード環境とプログラムで、マイコンの変数値を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件)
- 最新から表示
- 回答順に表示
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文字に変換する処理とか、データの始めと終りを何にするかの取り決めなどの事)を決めたのであれば、その「約束事」に添った受信プログラムが必要になります。
「約束事は自分で決めた」のですから、その「自分だけの約束事」に添った受信をするプログラムは自作するしかありません。
パソコンで受信プログラムを自作するのは難しいでしょうから、データをハイパーターミナルで受信して、ログをファイルに保存してください。
保存したログファイルを読み込んで、元のデータに戻して、数字を読める状態で表示するだけのプログラムなら、そう難しくはない筈です。
No.1
- 回答日時:
一つの方法はテキストにエンコードする。
現在Webで使ってる Base64ではなく 16進数にして一行 40バイト分くらいづつ送る。
TCP/IPと違って転送に信頼性が無いから
checksum CRC等入れると良い。
具体的には
http://www.starlet.co.jp/column/hexfile.htm
XMODEMを使う。
簡単なバイナリ-転送のプロトコルがあります。
エラーリトライをするので転送成功率が上がります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- ソフトウェア メディアコンバータのテスト 1 2023/04/06 18:49
- スピーカー・コンポ・ステレオ 私は、ヤマハのAVアンプ(RX-A1080)を使用しています。 1 2022/09/09 17:42
- 電車・路線・地下鉄 TX-1000系 TX-2000系 TX-3000系 1 2022/09/19 14:06
- ルーター・ネットワーク機器 L3スイッチからメディアコンバータを経由してPCへ接続出来ません。 3 2022/07/03 22:15
- PHP a href リンクタグでだけで 送信が できちゃっています。 1 2022/04/18 04:25
- HTML・CSS GETをPOSTに変更したところ 送信 不能です。 1 2022/04/10 17:31
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
サーバーソケットを開いたまま...
-
UdpClient 送信元のIPアドレ...
-
パケット通信時のIPヘッダの取...
-
ソケット通信のシミュレータツ...
-
Winsockで接続待ちタイムアウト...
-
JAVAでソケット通信(クライア...
-
recv関数でフリーズしてしまう
-
Socket通信での通信異常について
-
UDPの宛先ポートと送信元ポート...
-
バインドと接続(BindException...
-
ラズパイでのシリアル通信、音...
-
vbでの232c接続プログラムについて
-
ソケットのrecvの戻り値が0
-
割り込み処理について
-
非ブロッキングソケットのrecv...
-
CreateFile関数でCOMポートが開...
-
TCP/IP通信でのコネクシ...
-
クライアントソケットMACアドレ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
Socket通信の0バイト受信について
-
ソケット通信 同じポート番号...
-
相手のIPアドレスを取得する方法
-
ソケットでクライアントのipア...
-
VB6のwinsockでconnectできない
-
Connectエラーが出てしまう・・...
-
ソケット通信の送受信遅延-02 ...
-
同じLAN内パソコンのIPアドレス...
-
WinSockでの通信プログラムがう...
-
UDPのソケットプログラミング
-
非ブロッキングソケットのrecv...
おすすめ情報