# jun hirabayashi jun@hirax.net 2008.11.16- class Comport require 'wincom' require 'pp' def initialize(icomno=2,idcbflags=0x1807,ibaud=9600,ibyte=8,iparity=0,istopbits=0,irecbuf=204800,isenbuf=204800) @com=Serial.new @receiveStr='' open(icomno,idcbflags,ibaud,ibyte,iparity,istopbits,irecbuf,isenbuf) end def new(icomno=2,idcbflags=0x1807,ibaud=9600,ibyte=8,iparity=0,istopbits=0,irecbuf=204800,isenbuf=204800) @com=Serial.new @receiveStr='' open(icomno,idcbflags,ibaud,ibyte,iparity,istopbits,irecbuf,isenbuf) end def open(icomno=3,idcbflags=0x1807,ibaud=9600,ibyte=8,iparity=0,istopbits=0,irecbuf=204800,isenbuf=25600) @com.open(icomno,idcbflags,ibaud,ibyte,iparity,istopbits,irecbuf,isenbuf) end def close @com.close end def receive rcv=@com.receive if rcv!=nil @receiveStr=@receiveStr+rcv if /^(.*?)\r\n/=~@receiveStr ret=$1 ret.sub!(/^\./,'') ret=nil if ret=='' @receiveStr.sub!(/.*?\r\n/,'') elsif /^.*,(.+?),\<-top/=~@receiveStr ret=$1 @receiveStr.sub!(/^.*,(.+?),<-top/,'') else ret=nil end else ret=nil end ret end def send(schar) @com.send(schar) end end class ComThread require "thread" def initialize(icomno=2,rq=nil,sq=nil,idcbflags=0x1807,ibaud=9600,ibyte=8,iparity=0, istopbits=0,irecbuf=204800,isenbuf=204800) @comport=Comport.new(icomno,idcbflags,ibaud,ibyte,iparity,istopbits,irecbuf,isenbuf) @rq=rq if rq @sq=sq if sq end def start(condition={:receive=>false,:send=>false, :receiveMonitor=>false,:sendMonitor=>false}) @thread=Thread.new do while true #sleep 0.01 begin if condition[:receive] data=@comport.receive if data receive(data) p 'r:'+data if condition[:receiveMonitor] && data end end rescue pp 'exception!!' ensure end begin if condition[:send] unless @sq.empty? # pp 'empty?' @sq.length.times do data=@sq.pop send(data) pp 's:'+data if condition[:sendMonitor] && data end end end rescue ensure end end end end def stop Thread.kill(@thread) @comport.close end def receive(data) @rq.push(data) if @rq end def send(data=nil) @comport.send(data) unless !data end end