0

我正在编写一个从串行端口读取和写入的程序。有两个线程;一个线程每 500ms 对串口进行读写,另一个线程每 3s 对串口进行一次写入。

我遇到的问题是,因为 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
4

1 回答 1

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
  }
})
于 2012-11-06T09:35:07.510 回答