

シリアル通信が出来るスレッド(comThread)のサンプルには、二つのポートを必要とするようです。
しかし、外部の通信を行うには、ひとつのポートで送受信をするのが一般的です。
comThread を、ひとつのポートで送受信させるにはどのようにすれば良いですか?
参考にしたページは、こちら↓
http://www.hirax.net/mobile/content/7487
No.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
No.2
- 回答日時:
> シリアル通信が出来るスレッド(comThread)のサンプルには、
> 二つのポートを必要とするようです。
>参考にしたページは、こちら↓
>http://www.hirax.net/mobile/content/7487
上記参考ページのRubyサンプルで使っているRubyの
comThreadクラスは、送受信には1つのポートしか使いません。
サンプルプログラムが、「シリアル通信”モニタ”プログラム」
なので、二つのポートを使っているだけ、になります。そうでないと、
”モニタ”プログラムにはならないので…。
書き込み、ありがとうございます。
Rubyの構文を分かっていない所為か、「シリアル通信”モニタ”プログラム」の解読に手間取っておりまして、そのサンプルプログラムを機器の制御&通信用に改造したいと思います。
お分かりでしたら、ご教示をお願いします。
No.1
- 回答日時:
ポートを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文で受け取りたいと思います。
スレッドの中での動作確認は、まだしておりませんが、データの受け渡しはこれで良いでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UDPで受信スループットを測定
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
.NetのBackgroundWorkerクラス...
-
家電製品の電力周波数を変える機械
-
if ( a & b == b )
-
アプリケーションが終了するま...
-
C言語プログラミングで、多項式...
-
C#で通信処理。応答がない場合...
-
実行時のコマンドプロンプトを...
-
マルチスレッドのスレッド数を...
-
PIC mainループについて
-
VBA:CSVファイルの読出し手法...
-
bmp → jpeg への変換
-
.sb3のファイルを.sb2に変換す...
-
常駐するアプリケーションを初...
-
スレッドがサスペンドされてい...
-
InvalidateRectがうまくいかない
-
スレッドの終了を知りたい(Wind...
-
マンセル⇔XYZ,RGB変換式或いは...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
Socket通信の0バイト受信について
-
Winsockで接続待ちタイムアウト...
-
ソケットのクローズについて
-
UDP通信におけるbind関数について
-
VB6のwinsockでconnectできない
-
エクセル VBA でのCOMポート...
-
SIPがNATを越えられない理由
-
ソケットでクライアントのipア...
-
UdpClient 送信元のIPアドレ...
-
ソケット通信 同じポート番号...
-
VC++でのソケット通信について
-
TCP/IPプログラミングでのselec...
-
ソケット通信
-
ソケットのrecvの戻り値が0
-
UDP通信する時に、相手にどうや...
-
vxWorks6.4を使用してソケット...
-
SendRequestでヘッダが受信され...
-
ソケットを用いた1対多通信につ...
-
どうか、POSTでのファイル転送...
おすすめ情報