Основная проблема заключается в том, что ОС Raspberry PI или драйвер приводят к отключению и немедленному повторному подключению некоторых USB-соединений. Рассматриваемое устройство представляет собой RFID-считыватель, выполняющий роль клавиатуры. В результате мое приложение выходит из строя, и я теряю состояние. По разным причинам я не могу разумно сбросить состояние при перезагрузке. Я мог бы сохранить состояние и перезапустить, но это быстро становится неприятным. У нас работает 2 дюжины таких систем, и только часть из них обнаруживает проблему. Я не обнаружил в установках общей темы, которая помогла бы определить, что происходит.
Я могу перехватить, идентифицировать и обработать возникающее исключение, но Python не может обнаружить устройство после возникновения исключения, даже если оно снова появилось в каталоге устройства. Журналы ядра показывают, что оно отсутствует всего около 300 мс. Я пробовал подождать 10 секунд, прежде чем снова попробовать устройство, но безуспешно. Я хотел бы выяснить, как заставить библиотеку и Python распознавать, что устройство снова появилось, без необходимости перезапускать приложение.
Мой Google FU меня подвел: я нашел других, описывающих ту же проблему в ОС, но не нашел рекомендуемых диагностических шагов, исправлений или обходных путей.
Я использую EVDEV на Raspberry PI под управлением Python 3.9. (Да, я обновлю Python до самой последней доступной версии под ОС Raspberry PI, когда обновлю другой драйвер.)
Результирующее исключение выглядит следующим образом:
Код: Выделить всё
2025-10-22 09:21:06 User: {'authorized': True, 'id': '0009444691'}
2025-10-22 09:21:33 Exception: [Errno 19] No such device
Traceback (most recent call last):
File "drivers/RFID/KeyboardRFID.py", line 28, in run
for event in dev.read_loop():
File "/usr/local/lib/python3.9/dist-packages/evdev/eventio.py", line 46, in read_loop
for event in self.read():
File "/usr/local/lib/python3.9/dist-packages/evdev/eventio.py", line 71, in read
events = _input.device_read_many(self.fd)
Блок кода, который генерирует это:
Код: Выделить всё
for event in dev.read_loop():
# If key event and key up (0)
if event.type == ecodes.EV_KEY and event.value == 0:
key = scancodes.get(event.code)
if key == u'\n': # if enter
self.notifyScanObservers(rfid_code)
rfid_code = ""
else:
rfid_code = rfid_code + key
except Exception as e:
logging.error("Exception: %s" % str(e), exc_info=1)
os._exit(42) # Make sure entire application exits
Вся (немодифицированная) база кода приложения находится здесь:
https://github.com/Dallas-Makerspace/RFID-KeyMaster
И конкретный драйвер:
https://github.com/Dallas-Makerspace/RF ... ardRFID.py
Подробнее здесь: https://stackoverflow.com/questions/797 ... on-cant-se