0

シリアルポートとの間で読み書きするプログラムを書いています。2 つのスレッドがあります。1 つのスレッドは 500 ミリ秒ごとにシリアル ポートの読み取りと書き込みを行い、もう 1 つのスレッドは 3 秒ごとにシリアル ポートに書き込みます。

私が抱えている問題は、500 ミリ秒は 3 秒、6 秒、9 秒の 3 の倍数であるため、500 ミリ秒のループがシリアル ポートからの読み取り/書き込みに失敗することです。シリアルポートが使用中かどうかを確認する方法はありますか?

    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 に答える