logo       

[ruby-list:42171] Re: RS232Cによるパソコン間の通信の不具合(質問): msg#00202

lang.ruby.japanese

Subject: [ruby-list:42171] Re: RS232Cによるパソコン間の通信の不具合(質問)

結論から言いますと、PCと電子コンパスとの通信は、完璧に成功しました。
これまで、多くの皆様の助言により、とくに、最後まで指導いただいた なかむらさ
んのおかげでRuby本体だけで、RS232Cによる機器の制御が可能となる目途がつきまし
た。
すなわち、Ruby-serialportを利用せずに(利用したくても、Cを知らないとmakeで
きない)、RS232Cが直接に動かせることは、とても嬉しいことです。
ご協力いただいた皆様に心から感謝申し上げます。
これで、多くの機器の制御に使える可能性があります。例えば、野外でも利用可能な
軽量で長時間バッテリーで動くPDAから、機器を制御できる可能性がでてきました。
これから、PDA(linuxが動くザウルス)にRubyを搭載したいと考えています。
順調に機能することを期待していますが、また、ご支援をお願いするかもしれません
ので、よろしくお願いします。
なお、長くなりますが、最終的に成功した経緯をお知らせします。

1 バイナリーモード(binmode)の設定方法は理解しました。
"r+" にした理由は、readとwriteを同時に利用するためですが、"rb" で試したとき
に出た「エラー」が出た理由は、write命令を出したからでした。
"r+b"でもよいことがわかりました。
C:/ruby-hy/rbB4.tmp:72:in `syswrite': not opened for writing (IOError)

2  どう「正し」くなかったのでしょう?
> 逆に言えば、「正しいパケット」はどういうものなのでしょう?
> 続く「2」で正しくないパケットの例を出されてますが、何が正し
> いかわからないので、なにが怪しいかすらわかりません。

私の表現が悪く、表示した事例は正しいパケットの例です。「プログラムを変更した
わけではありませんが、今度は下記のように正しいデータ
をうけとれません。」の「下記のように」は正しい受信パケットを指しています。
A 7E 70 12 24 BC 88 9 C EB 1F F0 32 FC 83 1 2B F2 A2 C A7 FA AC
A 7E 70 12 24 BC 88 9 9 EB 1F F0 32 FC 83 1 32 F2 A6 C A4 FA B1
A 7E 70 12 24 BC 88 9 11 EB 1F F0 32 FC 83 1 30 F2 A6 C A8 FA BB
A 7E 70 12 24 BC 88 9 14 EB 1F F0 32 FC 83 1 29 F2 A2 C AB FA B6
A 7E 70 12 24 BC 88 9 16 EB 1F F0 32 FC 83 1 29 F2 A0 C AD FA B8
ただし、0Dが欠けています。

ちなみに、本当に正しい受信パケットは下記のようで、0Dも欠落せずに、完璧です。
0D 0A 7E 70 12 09 BB A7 FD 30 18 B3 EF F3 00 FF 01 7C F6 F9 0A F9 09 D3
0D 0A 7E 70 12 09 BB A7 FD 2D 18 B3 EF F3 00 FF 01 7A F6 F9 0A F7 09 CC
0D 0A 7E 70 12 0C BB A7 FD 2D 18 AC EF F3 00 FF 01 7C F6 F6 0A F5 09 C5
0D 0A 7E 70 12 0C BB A7 FD 2B 18 AC EF F3 00 FF 01 78 F6 F4 0A F2 09 BA

せっかくですので、詳細を記述します。PCからは、0D,0A,7Eの3つのStart-of−
Packet(sop)を送り、命令コード、データバイト数、データ、チェックサムのパ
ケットを送ります。
例えば、電子コンパスを計測する命令orient(0x70)の場合、
0D 0A 7E 70 00 05
を送信します。
これに対して、電子コンパスから、sopのエコーに続き、命令コード、データバイト
数、データ(9種の測定値、バイナリー)、チェックサムの情報をパケットで返しま
す。
チェックサムはパケットデータの合計値を256で剰余で与えられ、これを求めれ
ば、正しいデータが送られることを確認できました。

3 「正しいデータを受け取ることのできたプログラムを、再度、実行した結果、今
度は(おそらく)化けて受信しました。」という意味は、0D 0A 7E 70 12 09 BB A7
FD 30 18 B3 EF F3 00 FF 01 7C F6 F9 0A F9 09 D3のように、パケットの先端にsop
がなく、内容に意味がないパケットです(ここでは掲載を省略します。)。

 プログラムが完全に機能し始めると、今度は、何故、無意味なパケットを受信した
のか理由が不明です。
 おそらく、通信モードの設定が命令通りに動いていなかったとしか考えられませ
ん。たまたまのようですが。
> えーと、「正しいデータを受け取ることのできたプログラム」とは、何で書かれた
プログラムなのでしょう?
> Rubyで書いたものが正しく動いたことがあった、ということなので しょうか?
 そのとおりです。

4 「ruby -v の出力」という意味がわからずに、お知らせせずにいたことをお許し
ください。

5 拡張ライブラリーを活用することは、これからの課題です。
 自作するCのライブラリーを動かすことは、例えばGD(写真や図の解析に利用す
るモジュール)を使う予定にしていますので、是非に習得したいのです。
 すでに[ruby-list:42165] で述べたように、Ruby本体は「ruby 1.8.2
(2004-11-06) [i386-mswin32]」でRDE上で動かしています。
 マイクロソフト VC++.NETと組み合わせられるのかどうかが問題なのです。







<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise