樹莓派讀取條碼掃碼槍

2021-10-04 06:37:44 字數 4037 閱讀 6199

平時用的最多的掃瞄槍通常只是乙個簡單的輸入裝置(好比鍵盤,滑鼠), 另一頭需要連線電腦, 用的 usb 或者串列埠. 掃瞄槍負責識別條碼, 電腦收到後執行業務的邏輯. 有時候只是簡單的資料採集工作, 資料傳到伺服器雲端, 放台電腦在那兒顯得浪費而且需要昂貴的維護. 而小巧靈活而且**低廉的樹莓派同學馬上舉手說: 「我可以!」

可能你已經想到了, 用圖形介面不是很 easy 嗎? 是的, 但不是最好的辦法. 即使目前最新版樹莓派 4b 的效能對於圖形介面來說只能算得上及格. 我們的目標是後台程序接受錄入, 開機即用.

帶 usb 接收器的條碼掃瞄槍 

樹莓派 4b

我們將用到 python-evdev 程式庫, 封裝了對 usb 裝置的讀寫操作. 官網 

sudo pip install evdev
編寫**

簡單幾行**檢測 usb 裝置:

#!/usr/bin/python3

import evdev

# 列出 usb 裝置

devices = [evdev.inputdevice(path) for path in evdev.list_devices()]

print('發現裝置: ')

for device in devices:

print(device.path, device.name, device.phys)

執行結果:

發現裝置:

/dev/input/event0 netum. hidkb usb-0000:01:00.0-1.3/input0

顯示成功讀到了掃瞄槍裝置. 接下來要讀取掃瞄槍的輸入了. 修改前面的**

#!/usr/bin/python3

import asyncio, evdev

# 檢測到輸入時觸發

async def print_events(device):

async for event in device.async_read_loop():

print(device.path, evdev.categorize(event), sep=': ')

# 列出 usb 裝置

devices = [evdev.inputdevice(path) for path in evdev.list_devices()]

print('發現以下裝置: ')

for device in devices:

print(device.path, device.name, device.phys)

for device in devices:

# 用 asyncio 同時接受多個裝置的錄入

asyncio.ensure_future(print_events(device))

loop = asyncio.get_event_loop()

loop.run_forever()

為了相容多個裝置的輸入用到了 

asyncio, 非同步執行單個裝置的事件迴圈, 這樣就不會因為乙個裝置的輸入 block 住其他裝置.

執行看看效果:

發現以下裝置: 

/dev/input/event0 netum. hidkb usb-0000:01:00.0-1.3/input0

/dev/input/event0: event at 1584874459.655187, code 00, type 17, val 01

/dev/input/event0: event at 1584874459.655187, code 04, type 04, val 458787

/dev/input/event0: key event at 1584874459.655187, 7 (key_6), down

/dev/input/event0: synchronization event at 1584874459.655187, syn_report

/dev/input/event0: event at 1584874459.656157, code 04, type 04, val 458787

/dev/input/event0: key event at 1584874459.656157, 7 (key_6), up

/dev/input/event0: synchronization event at 1584874459.656157, syn_report

/dev/input/event0: event at 1584874459.657169, code 04, type 04, val 458790

/dev/input/event0: key event at 1584874459.657169, 10 (key_9), down

/dev/input/event0: synchronization event at 1584874459.657169, syn_report

/dev/input/event0: event at 1584874459.658158, code 04, type 04, val 458790

/dev/input/event0: key event at 1584874459.658158, 10 (key_9), up

………….

把每個按鍵的詳細事件列印出來了. 說明成功接收到輸入了. 還差一步, 把按鍵的內容轉換成字串. 繼續修改**:

#!/usr/bin/python3

import asyncio, evdev

# 按鍵轉字元表 只列出了常用的字元

keymap =

# 檢測到輸入時觸發

async def print_events(device):

buf = ''

async for event in device.async_read_loop():

# key_up= 0 key_down= 1 key_hold= 2

if event.type == evdev.ecodes.ev_key and event.value == 1:

kv = evdev.events.keyevent(event)

# 本次修改的地方, 把事件對映到字元表

if (kv.scancode == evdev.ecodes.key_enter):

print('讀到輸入: ', buf)

'''業務邏輯

'''# 清空 buffer

buf = ''

else:

buf += keymap.get(kv.keycode)

devices = [evdev.inputdevice(path) for path in evdev.list_devices()]

print('發現以下裝置: ')

for device in devices:

print(device.path, device.name, device.phys)

for device in devices:

asyncio.ensure_future(print_events(device))

loop = asyncio.get_event_loop()

loop.run_forever()

再來執行**, 順利拿到條碼內容了.

增加點難度, 這次測試還加入了鍵盤, 效果棒棒噠.

以上實驗全部**都在 

實現條碼槍的無焦點掃碼

在上一家公司創業初期,我接觸的第乙個專案是醫院的 室消毒包管理系統,幾乎一人之力用了兩個多月的時間,完成了基本的開發工作。回想起來,當時有個設計印象深刻。趁著還有記憶,記錄下來,供大家一時之需。當時開發的時候,對於物資的管理,自然離不開條碼槍的角色。設計的是無線條碼槍,讓工作人員可以自由的在作業現場...

js 條碼槍掃瞄 js獲取USB掃碼槍資料

前言找了很多相關的教程不太好用,汲取各家之長總結精簡了一下 原理掃碼槍掃瞄到的條形碼每一位會觸發一次onkeydown事件 比如掃瞄條碼位 1234567890 的條形碼,會連續執行10次onkeydown事件 條碼掃瞄到最後一位,會直接觸發enter 支援vue data else if e.wh...

js讀取usb掃碼槍資料

條碼掃瞄器其實就是一種輸入裝置,跟鍵盤一樣。在控制台列印掃瞄過程,可以看出,掃瞄過程就像是在鍵盤上敲擊相應的鍵,keycode和鍵盤是一一對應的,只是輸入速度 間隔時間 比物理鍵盤輸入要快得多。我們可以通過監聽輸入間隔時間,來判斷到底是鍵盤輸入還是掃瞄輸入。掃碼槍輸入的時間間隔一般在10毫秒以內,物...