python - 如何在Raspberry pi 4中将usb条形码扫描仪输入python
问题描述
我正在尝试在 python 中获取 USB 条形码阅读器输入,所以我使用了这段代码
#thanks to https://stackoverflow.com/questions/19732978/how-can-i-get-a-string-from-hid-device-in-python-with-evdev
#thanks to https://raspberrypi.stackexchange.com/questions/82418/how-to-route-barcode-tty-input-to-python
from evdev import InputDevice, categorize, ecodes
scancodes = {
# Scancode: ASCIICode
0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 19: u'r',
20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 36: u'j', 37: u'k', 38: u'l', 39: u';',
40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n',
50: u'm', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
}
capscodes = {
0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*',
10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'{', 27: u'}', 28: u'CRLF', 29: u'LCTRL',
30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':',
40: u'\'', 41: u'~', 42: u'LSHFT', 43: u'|', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N',
50: u'M', 51: u'<', 52: u'>', 53: u'?', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
}
def readBarcode(devicePath):
dev = InputDevice(devicePath)
dev.grab() # grab provides exclusive access to the device
x = ''
caps = False
for event in dev.read_loop():
if event.type == ecodes.EV_KEY:
data = categorize(event) # Save the event temporarily to introspect it
if data.scancode == 42:
if data.keystate == 1:
caps = True
if data.keystate == 0:
caps = False
if data.keystate == 1: # Down events only
if caps:
key_lookup = u'{}'.format(capscodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode) # Lookup or return UNKNOWN:XX
else:
key_lookup = u'{}'.format(scancodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode) # Lookup or return UNKNOWN:XX
if (data.scancode != 42) and (data.scancode != 28):
x += key_lookup
if(data.scancode == 28):
return(x)
readBarcode("/home/pi/.local/lib/python3.7/site-packages/evdev/device.py")
我收到此错误
回溯(最后一次调用):文件“/home/pi/.local/lib/python3.7/site-packages/evdev/device.py”,第 125 行,init fd = os.open(dev, os. O_RDWR | os.O_NONBLOCK) FileNotFoundError: [Errno 2] 没有这样的文件或目录:'/dev/input/ev'
是什么导致了这个错误,我该如何解决?
解决方案
devicePath 应该是 RPi 上设备(即条形码扫描仪)的路径。您似乎已将其设置为某个名为 device.py 的文件。尝试按照此处的说明获取可用设备的列表,然后将该设备路径用作 devicePath。
如果您查看我引用的页面上的示例,您会发现 devicePath 应该看起来像 /dev/input/event1 或其他东西。不是文件路径。
推荐阅读
- c# - 如何在itext7 html到pdf转换器的converterproperties中设置baseuri
- ios - Firestore FieldValue.serverTimestamp() 正在保存本地时间戳而不是服务器的时间戳
- excel - SpecialCells(12).Value 在第一个隐藏行后停止
- unity3d - 应用安装 Unity 后清除本地存储
- angular - Angular:TypeError:无法读取 null 的属性“firstCreatePass”
- xml - 选择具有多个非嵌套特定子级的 div
- azure - Azure ARM 模板 GEN_PASSWORD 占位符不起作用
- python - 使用 csv 我想选择一个带有数据的随机行并提取数据,所以 S =songs 和 A = artist,repeat
- angular-cli - 无法使用 Angular 10 创建新应用
- php - 当值为空时,Laravel 将日期设置为 1970