我正在構建一個從鍵盤仿真設備中消耗數據的設備驅動程序。ubuntu上的鍵盤模擬器設備行爲
該設備是刷卡,所以其行爲如下:
- 用戶走向,揮筆卡
- 我得到字符(鍵碼的字符串,真的,包括對資本修改鍵字母)
- 我不知道我有多少個字符會得到
- 當我得到我不知道的東西
因爲我不知道我會得到多少個字符,所以在鍵盤上阻止讀取tty沒有用 - 我最終會在最後一個字符後阻止。我正在做的是,在Ruby中,使用IO模塊對鍵盤設備執行異步讀取,並使用超時確定數據已到達。這在邏輯上工作正常(甚至用戶快速刷卡他/她的卡將比字符之間的發送速率慢)。
問題是,我有時會丟失字符串中間的數據。我的直覺是發生了某種緩衝區溢出,因爲我讀取的數據太慢了。試圖證實這一點,我在每個關鍵流程之間插入了小的等待。較長的等待時間(20ms +)會加劇問題。然而,等待約5ms實際上會讓它消失?我能想出的唯一解釋是異步讀取本身是昂貴的(因爲Ruby),並且在沒有速率限制的情況下執行它實際上比它們以和延遲5ms要慢。
這聽起來合理嗎?有關於這可能是什麼的其他想法?
紅寶石實際上是JRuby的9000本機是Ubuntu的LTS 16
編輯:這裏的相關代碼
private def read_swipe(buffer_size, card_reader_input, pause_between_reads, seconds_to_complete)
limit = Time.now + seconds_to_complete.seconds
swipe_data = ''
begin
start_time = Time.now
sleep pause_between_reads
batch = card_reader_input.read_nonblock(buffer_size)
swipe_data << batch
rescue IO::WaitReadable
IO.select([card_reader_input], nil, nil, 0.5)
retry unless limit < start_time
end while start_time < limit
swipe_data
end
的一個片段,其中card_reader_input = File.new(event_handle, 'rb')
你能展示一些你的代碼來獲得更好的主意嗎 –
@maxpleaner done – kolosy