我正在编写一个程序,可以从串口读取和写入。有两个线程;一个线程每隔500毫秒从串口读取一次,另一个线程每3秒写一次串口。
我遇到的问题是,因为500ms是3s的倍数,3s,6s,9s ...... 500ms循环无法读取/写入串行端口。有没有办法检查串口是否正在使用?
counter = 0
switchRelays = DoEvery([3], 20) do
sp.write "@00 WR #{relays[counter]}\r"
counter = (counter + 1) % relays.length
end
# This thread samples every 500ms.
sp.write "@00 AI 0\r"
sleep 0.2
sample500 = DoEvery([0.5], 1.0/0.0) do |timeStamp|
if switchRelays.alive? == false
csv.close
puts 'Done'
sample500.exit
else
sleep 0.1
analogueStatus = sp.readline
sp.write "@00 AI 0\r"
end
end
答案 0 :(得分:2)
这是共享对象的典型示例,您需要同步并发访问尝试。
例如,您可以使用Mutex。
require 'thread'
semaphore = Mutex.new
a = Thread.new {
semaphore.synchronize {
# write to the port
}
}
b = Thread.new {
semaphore.synchronize {
# write to the port
}
})