# jun hirabayashi jun@hirax.net 2008.11.16- # Rev.2009.11.12 class Comport require 'wincom' def initialize(condition) @com=Serial.new @receiveStr='' @contition={:icomno=>2,:idcbflags=>0x1807,:ibaud=>9600,:ibyte=>8,:iparity=>0, :istopbits=>0,:irecbuf=>204800,:isenbuf=>204800} @contition.merge!(condition) open end def new(condition) @com=Serial.new @receiveStr='' @contition={ :icomno=>2,:idcbflags=>0x1807,:ibaud=>9600,:ibyte=>8,:iparity=>0, :istopbits=>0,:irecbuf=>204800,:isenbuf=>204800} @contition.merge!(condition) open end def open @com.open(@contition[:icomno],@contition[:idcbflags],@contition[:ibaud], @contition[:ibyte],@contition[:iparity],@contition[:istopbits], @contition[:irecbuf],@contition[:isenbuf]) end def close @com.close end def receive(delimeter) rcv=@com.receive ret=nil if rcv!=nil @receiveStr=@receiveStr+rcv if /^(.*?)#{delimeter}/=~@receiveStr ret=$1 ret.sub!(/^\./,'') ret=nil if ret=='' @receiveStr.sub!(/.*?#{delimeter}/,'') end end ret end def send(schar) @com.send(schar) end end class ComThread require "thread" def initialize(properties) @properties={:icomno=>2,:rq=>nil,:sq=>nil,:idcbflags=>0x1807, :ibaud=>9600,:ibyte=>8,:iparity=>0, :istopbits=>0,:irecbuf=>204800,:isenbuf=>204800} @properties.merge!(properties) @comport=Comport.new(@properties) end def start(condition) @condition={:receive=>false,:send=>false, :receiveMonitor=>false,:sendMonitor=>false, :isBinary=>false,:delimeter=>"\r\n"} @condition.merge!(condition) @thread=Thread.new do while true begin if @condition[:receive] data=@comport.receive(@condition[:delimeter]) if data receive(data) p 'r:'+data if @condition[:receiveMonitor] && data end end rescue pp 'exception!!' ensure end begin if @condition[:send] unless !@sq &&@sq.empty? @properties[: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