Завершить процесс, вызывающий занятость устройства или ресурса: '/ dev / ttyUSB0'?

Я подключаюсь к своей плате Arduino с помощью следующего кода Python.

device=glob.glob("/dev/ttyUSB*")[0]
time.sleep(1)
arduino = serial.Serial(device, 115200, timeout=5)

Обычно это работает, но каким-то образом какой-то другой процесс должен получать доступ к плате после перезагрузки, давая мне ошибку.

serial.serialutil.SerialException: не удалось открыть порт / dev / ttyUSB0: [Errno 16] Устройство или ресурс занят: '/ dev / ttyUSB0'

При отключении и повторном подключении USB-разъема я могу нормально выполнить код Python, без возникновения ошибок. Как я могу избежать блокировки порта другими процессами? А как узнать причину этой ошибки?


person birgit    schedule 02.12.2011    source источник


Ответы (3)


Ты можешь использовать

$ fuser /dev/ttyUSB0

для вывода списка PID процессов, использующих файл. В качестве альтернативы, если ваша команда fuser поддерживает это, вы можете использовать параметр -k, чтобы убить их.

person Diego Torres Milano    schedule 02.12.2011
comment
Это не всегда работает, например, если вы использовали экран GNU для доступа к ttyUSBx device, а затем завершили работу с помощью Ctrl-C, вы получите устройство занято, но оно не появится с помощью указанной выше команды. - person gbmhunter; 17.09.2014
comment
Как мне тогда исправить?!?! : D - person 0xbaadf00d; 03.10.2014
comment
Вам нужно убить прикрепленный сеанс экрана. В идеале повторное подключение через экран и закрытие его красиво, неидеально, убивая экранный процесс, которому принадлежит ttyUSB. - person timB33; 26.11.2018

В моем случае

$ fuser /dev/ttyUSB0

не работал (ничего не показывал).

Однако работало следующее:

$ sudo lsof /dev/ttyUSB0

Это дало мне список процессов, которые использовали мой последовательный порт, и я мог просто kill их, используя PID (соответствующий второму столбцу в списке).

person Alf    schedule 20.02.2020
comment
sudo lsof /dev/ttyUSB0 у меня тоже сработало, спасибо! - person Sean McCarthy; 10.11.2020

Бегать:

$ ps ax

Вы увидите, какой процесс использует последовательный порт. Убейте этот процесс. Это решило проблему для меня.

person Anastasia    schedule 26.03.2020