- 締切済み
comThread を、COM1のみで送受信するには
シリアル通信が出来るスレッド(comThread)のサンプルには、二つのポートを必要とするようです。 しかし、外部の通信を行うには、ひとつのポートで送受信をするのが一般的です。 comThread を、ひとつのポートで送受信させるにはどのようにすれば良いですか? 参考にしたページは、こちら↓ http://www.hirax.net/mobile/content/7487
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- hiraxnet
- ベストアンサー率0% (0/0)
受信した内容を、そのままオウム返しに送信するだけなら、下記のような具合で良いと思います。「受信をスレッドを通してprint文で受け取りたい」というのであれば、ComThread.newに:receive=>trueオプションを付けるだけではないでしょうか。 require 'comThread' q=Queue.new aComThread=ComThread.new({:icomno=>3,:rq=>q,:sq=>q}) aComThread.start() sleep 60 aComThread.stop
- hiraxnet
- ベストアンサー率0% (0/0)
> シリアル通信が出来るスレッド(comThread)のサンプルには、 > 二つのポートを必要とするようです。 >参考にしたページは、こちら↓ >http://www.hirax.net/mobile/content/7487 上記参考ページのRubyサンプルで使っているRubyの comThreadクラスは、送受信には1つのポートしか使いません。 サンプルプログラムが、「シリアル通信”モニタ”プログラム」 なので、二つのポートを使っているだけ、になります。そうでないと、 ”モニタ”プログラムにはならないので…。
お礼
書き込み、ありがとうございます。 Rubyの構文を分かっていない所為か、「シリアル通信”モニタ”プログラム」の解読に手間取っておりまして、そのサンプルプログラムを機器の制御&通信用に改造したいと思います。 お分かりでしたら、ご教示をお願いします。
- notnot
- ベストアンサー率47% (4900/10358)
ポートを1つにすると、うまく動かないと言うことですか?ハードウェアが原因と言うこともあり得るかも。具体的な現象はどうでしょう?
補足
ひとつのポートで受信させてから送信するようにプログラムを組んでみました。 if __FILE__ == $0 require 'C:/Ruby/usr/comThread' q=Queue.new r=Queue.new rsComThread=ComThread.new({:icomno=>1,:sq=>q, :rq=>r}) #COM1 rsComThread.start({:send=>true, :sendMonitor=>true, :receive=>true, :receiveMonitor=>true}) # rsComThread.start({:send=>true, :sendMonitor=>true}) sleep 10 @rchar = r.pop print @rchar, "\n" q.push("Hello!\r\n") sleep 1 rsComThread.stop end ---------------------------------------------------- # class for treat serial transport in Thread class ComThread require "thread" def initialize(conf) @conf={:icomno=>2,:rq=>nil,:sq=>nil,:idcbflags=>0x1805, :ibaud=>38400,:ibyte=>8,:iparity=>0,:istopbits=>0, :irecbuf=>512,:isenbuf=>512,:delimiter=>"\r\n"} @conf.update(conf) @comport=Comport.new(@conf) end def start(cond) condition={:receive=>false,:send=>false,:receiveMonitor=>false,:sendMonitor=>false} condition.update(cond) @comport.open @thread=Thread.new do while true if condition[:receive] data=@comport.receive if data receive(data) p 'r:'+data if condition[:receiveMonitor] end end if condition[:send] && @conf[:sq] unless @conf[:sq].empty? @conf[:sq].length.times do data=@conf[:sq].pop send(data) p 's:'+data if condition[:sendMonitor] end end end end end end def stop Thread.kill(@thread) @comport.close end def receive(data) @conf[:rq].push(data) if @conf[:rq] end def send(data=nil) @comport.send(data) unless !data end end 送信は出来ますが、受信をスレッドを通してprint文で受け取りたいと思います。 スレッドの中での動作確認は、まだしておりませんが、データの受け渡しはこれで良いでしょうか?
補足
教えていただいたコードを、そのまま行ってみましたが、エラーとなってはじかれます。 aComThread.start() ← ここです `start': wrong number of arguments (0 for 1) (ArgumentError) 説明不足なら、ご迷惑をお掛けしますので、もう一度説明します。 1.外部に、1台のシリアル送受信機があります。 2.PC側のポートを1ポートのみ使用をしてデータの送受信をします。 3.外部から、任意のAsciiコードを送ってきます。 4.PCからも、任意のAsciiコードを送ります。 現状は、PCからの送信は出来ますが、受信した様子はありません。 q=Queue.new aComThread=ComThread.new({:icomno=>1,:rq=>q,:sq=>q}) aComThread.start({:receive=>true,:send=>true,:receiveMonitor=>true,:sendMonitor=>true}) sleep 10 q.push("Hello!\r\n") sleep 5 aComThread.stop 以上、よろしくお願いします。 m(_ _)m