重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

シリアル通信が出来るスレッド(comThread)のサンプルには、二つのポートを必要とするようです。

しかし、外部の通信を行うには、ひとつのポートで送受信をするのが一般的です。
comThread を、ひとつのポートで送受信させるにはどのようにすれば良いですか?

参考にしたページは、こちら↓
http://www.hirax.net/mobile/content/7487

A 回答 (3件)

 受信した内容を、そのままオウム返しに送信するだけなら、下記のような具合で良いと思います。

「受信をスレッドを通して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

参考URL:http://www.hirax.net/diaryweb/2009/11/11.html#8505

この回答への補足

教えていただいたコードを、そのまま行ってみましたが、エラーとなってはじかれます。
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

補足日時:2009/12/16 18:06
    • good
    • 0

> シリアル通信が出来るスレッド(comThread)のサンプルには、


> 二つのポートを必要とするようです。
>参考にしたページは、こちら↓
​>http://www.hirax.net/mobile/content/7487

 上記参考ページのRubyサンプルで使っているRubyの
comThreadクラスは、送受信には1つのポートしか使いません。
サンプルプログラムが、「シリアル通信”モニタ”プログラム」
なので、二つのポートを使っているだけ、になります。そうでないと、
”モニタ”プログラムにはならないので…。
    • good
    • 0
この回答へのお礼

書き込み、ありがとうございます。

Rubyの構文を分かっていない所為か、「シリアル通信”モニタ”プログラム」の解読に手間取っておりまして、そのサンプルプログラムを機器の制御&通信用に改造したいと思います。

お分かりでしたら、ご教示をお願いします。

お礼日時:2009/12/15 09:41

ポートを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文で受け取りたいと思います。
スレッドの中での動作確認は、まだしておりませんが、データの受け渡しはこれで良いでしょうか?

補足日時:2009/12/15 09:36
    • good
    • 0

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