logo       

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

lang.ruby.japanese

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

様々にご検討をいただき感謝申し上げます。

 PC1及びPC2ともに、OSはWinodws2000を、RubyはRDE上で起動させています。
 なかむらさんの指示を受けて、PerlやRubyで再度、同じような一連の操作を試み、
結果を示そうとしました。
 ところが、同じ状態を再現されず、当初と同じ動作をしませんでした。

1 永井さんのご指摘のポートの設定について
 確認してみました。コントロールパネル=>システム=>デバイスマネージャー
=>通信ポート(COM1)=>ポートの設定を開き、そこに設定される5項
目を、Rubyから直接にsystemで変更されるか調べました。
 すなわち、"MODE COM1 BAUD=9600 DATA=8 STOP=1"と命令すれば、コマンドプロン
プトでCOM1の状態を表示され、変更されることを確認しました。
  例えば、BAUD=4800にすれば、COM1の設定が変更されます。
 ところが、通信ポート(COM1)=>ポートの設定を開いて中味をみると、変更
前の状態 (BAUD=9600)のままでこの項目は変化していないことを確認しました。
 すなわち、プログラムを使用する際の設定と、上記のポート設定は同一でないこと
がわかりました。

 しかし、このsystemを利用して、プログラム上でポート設定をしても問題は解決し
ませんでした。

2  木村さん、なかむら(う)さんのご指摘について
<| ちょっと検索した限りでは、WindowsAPIのレベル(CreateFile/ReadFile etc)で
<| COM1などのポートの読み書きはできるようですが、サンプルプログラムでは
<| 1byteずつ読み込みしてました。ここである程度のバイト数を一気読みするよう
<| になっているとバイト数が足りないときにブロックされるのではないかと思いま
<| す。
<それが正解かと思います。

<要するに、IO#readを使うと内部的にバッファリングを行うために複
<数バイト読み込みが行われてしまい、それでブロックしてしまう、
<ということのようです。
<# 実際はそんなには単純じゃないようでもありますが...

<というわけで、プラットフォームが不明なのでmswin32版であると決
<め打ちして回答してしまうと、受信側スクリプトの
< c = port.read(1)
<という部分を
< c = port.sysread(1)
<とすれば正常に動作すると思われます。

最初に述べたように、PC2からPC1へと送信したのですが、動きません。再現で
きなかったのです。
そこで、c = port.sysread(1)に変更すると、以前と同じように動きました。しか
し、結果は、問題点1で述べたように、「PC2を再実行し、再度送信すると、最初
の実行による50個のデータを受信後、8個の途中まで受信する。 反応が中途半端
である。」となります。例示したスクリプト通りに、送信文字を変更した場合、
PC1で受信した結果は、途中を省力しますが、以下のとおりでした。
1==> xyz
2==> xyz
3==> xyz
・・・・・
45==> xyz
46==> xyz
47
結局は、PC1が、PC2から送信された500文字(正確には499文字)を全て受け取っ
てから、PC1は、画面上に表示を開始しました。
すなわち、1文字ずつ逐一printがされるのではなく、まとめてprint処理され
ることがわかりました。ここは、理解しにくいところです。
したがって、この簡単な方法では、具合が悪いことがわかりました。

3 青木さん、永井さんのご指摘について
<ruby-serialportとかいかがでしょうか?
<http://ruby-serialport.rubyforge.org/
 ご指摘のように、上記の簡単なプログラムでは、再現性がなく、動作が不安定で
す。
一方、 ruby-serialportの存在は知っていましたが、いわゆるモデム対応の余計な
機能が装備されたプログラムと思いこんでいました。
 MS-DOS時代のBASICやquickBASICでは、簡単な指令で充分に機能していたの
で、簡単で軽量な方法に挑戦し始めた次第です。
  ruby-serialportにも挑戦してみます。

矢幡 久







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

News | FAQ | advertise