|
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てな感じで良いのかも。