【问题标题】:Python evdev [Error 16] Device or resource busyPython evdev [错误 16] 设备或​​资源繁忙
【发布时间】:2022-12-03 17:07:22
【问题描述】:

我将 2D 条码扫描器与 Raspberry Pi 4 Model B 连接起来并尝试扫描少量代码。在使用开发者图书馆我成功地得到了输出。但问题是在 3 次继续扫描后它抛出一个异常说“[错误 16] 设备或​​资源繁忙”.我无法找到此问题的根本原因并尝试了许多故障排除方法,但似乎没有任何效果。谁能帮帮我吗。这是我使用的代码。

from evdev import InputDevice, categorize, ecodes
from datetime import datetime
import calendar

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'
}

class scan_barcode:
    
    def __init__(self,devicePath):
        self.devicePath = devicePath
        
        
    def readBarcode(self):

        dev = InputDevice(self.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)

scanned_data = scan_barcode('/dev/input/event0')
def scanner_function():
  try:
    value = scanned_data.readBarcode()
    print(f"Scanned value:{str(value)}")
  except Exception as e:
    print(e)
    pass
while True:
  scanner_function()

即使当我通过异常时它也不会让我转移到其他任务。整个过程到此为止。

这是输出:

Scanned value: 4568hidhXGu
Scanned value: 1238fujXjje75
Scanned value: 789665
[Error 16] Device or resource busy
[Error 16] Device or resource busy
[Error 16] Device or resource busy
[Error 16] Device or resource busy
[Error 16] Device or resource busy

【问题讨论】:

  • 这可能是因为您一直在运行 scanner_function(),它每次都会初始化 InputDevice 并执行 dev.grab()?如果只在程序开始时发生一次,则该问题可能会得到解决。
  • @ItaiSteinherz 您好,感谢您的回复。以前我尝试在导入头文件后初始化这个dev.grab( ),最后在没有while True的情况下调用scanner_function()。但是我又遇到了同样的错误。这是我试过的。 ``````

标签: python linux barcode-scanner raspberry-pi4 evdev


【解决方案1】:

我不确定问题是否与您的代码有关。我认为这与您的扫描仪更相关。我已经使用 R32 二维码阅读器 (https://www.sycreader.com/en/3650/) 测试了您的脚本,效果非常好。 您使用的是什么扫描仪类型?

结果:

Scanned value:Toiletbezoek DateTime:2022-12-03 09:49:11.035355

扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:11.675270 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:14.563287 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:15.007284 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:15.799299 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:20.959301 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:21.591286 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:24.515289 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:26.331292 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:31.323339 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:32.747289 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:34.495291 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:36.367294 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:37.903286 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:39.507295 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:41.099288 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:42.575295 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:44.123283 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:45.579286 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:47.055336 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:48.671301 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:49.983288 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:52.779284 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:54.755299 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:56.159286 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:57.555288 扫描值:Toiletbezoek 日期时间:2022-12-03 09:49:59.019282 扫描值:Toiletbezoek 日期时间:2022-12-03 09:50:00.723322 扫描值:Toiletbezoek 日期时间:2022-12-03 09:50:04.195291 扫描值:Toiletbezoek 日期时间:2022-12-03 09:50:05.703298

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 2016-08-29
    • 2015-09-24
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多