首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将usb条形码扫描器输入Raspberry pi 4中的python

如何将usb条形码扫描器输入Raspberry pi 4中的python
EN

Stack Overflow用户
提问于 2020-12-03 23:24:22
回答 2查看 5.1K关注 0票数 1

我正在尝试在python中输入usb条形码读取器,所以我使用了以下代码

代码语言:javascript
复制
#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.open) FileNotFoundError: Errno 2没有这样的文件或目录:'/dev/input/ev‘

是什么导致了这个错误,我如何修复它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-03 23:53:10

devicePath应该是到达RPi上的设备(即条形码扫描器)的路径。您似乎已经将其设置为一个名为device.py的文件。尝试按照这里的说明获得可用设备的列表,然后使用该设备路径作为devicePath。

如果您查看我所引用的页面上的示例,您将看到一个devicePath应该是/dev/dev/event1 1之类的。不是文件路径。

票数 1
EN

Stack Overflow用户

发布于 2021-10-15 08:46:48

谢谢你的代码在我的项目中帮助我,但请切换输入40,因为双逗号与移位现在按在40: u'\''的加盖上是单个逗号。我在程序中添加了dev.ungrab()

代码语言:javascript
复制
if(data.scancode == 28):
      dev.ungrab()
      return(x)

因为当我调用该函数时,我得到了“设备或资源忙”错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65135705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档