|
setup diary | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def read()
@rs.write(sprintf("L\x0d\x0a"))
t=Thread::start{@v=@rs.gets("\x0d\x0a").to_f}
t0=Time::now
while Time::now < t0+1
return @v unless t.alive?
sleep 0.01
end
t.kill
print "rs232c timeout!\n"
@v=-1.0
return @v
end
もっとシンプルに書ける気がするが、読み取りはスレッドにまかせて、それが終了していたらその値を返して、それがいつまでも終わらなかったら、スレッドを殺すという感じである。
これで、RS232Cのエラーは無くなるはずだが、これが本当の原因なのかはまだはっきりしないので、他の部分も調べないと。
require 'timeout'
def read()
@rs.write(sprintf("L\x0d\x0a"))
timeout(1){
return @rs.gets("\x0d\x0a").to_f
}
rescue TimeoutError
return -1.0
end
end
てな感じで良いのかも。