2012-11-06 85 views
0

我正在寫一個程序,它從串口讀寫。有兩個線程;一個線程每隔500ms從串行端口讀寫數據,另一個線程每3s寫入一次串行端口。從兩個不同的線程同時訪問IO(串口)

我遇到的問題是,因爲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 
+1

那麼,什麼問題? –

+0

哎呀,沒有意識到...我編輯。 –

+0

你應該同步你的訪問端口([mutexes](http://www.ruby-doc.org/core-1.9.3/Mutex.html)等)。 –

回答

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 
    } 
}) 
相關問題