#python #linux #bash #serial-port
#python #linux #bash #последовательный порт
Вопрос:
У меня есть устройство, к которому я подключаюсь с помощью последовательного порта. У меня есть программа на Python, которая взаимодействует с ним. Но это должно быть запущено с помощью скрипта bash, который сначала проверит, к какому последовательному порту он подключен, и предоставит необходимое разрешение. Затем он запустит скрипт python, который должен иметь механизм для понимания, к какому порту он подключен (например, аргумент, передаваемый ему скриптом bash).
В настоящее время мой скрипт bash
#script
sudo chmod 666 /dev/ttyUSB0
sudo chmod 666 /dev/ttyUSB1
sudo chmod 666 /dev/ttyUSB2
Если устройство подключено к ttyUSB1, я получаю сообщение об ошибке chmod: cannot access ‘/dev/ttyUSB0’: No such file or directory
для первой строки. Вот как я знаю, что он подключен к USB1. В программе python есть строка ser=serial.Serial('/dev/ttyUSB1',115200, timeout=1)
, которую я изменяю вручную, как только узнаю, какой последовательный порт правильный.
Как мне проверить, к какому порту подключено устройство, и сообщить об этом программе python?
Ответ №1:
Поскольку вы используете chmod, вы можете проверить код выхода, используя $? и включите оператор if, чтобы выйти из скрипта и загрузить python.
В качестве примера:
#!bash
sudo chmod 666 /dev/ttyUSB0
if [$? = 0]
then
pythonscript /dev/ttyUSB0
Пробег здесь может варьироваться, это довольно сложно. Вы также можете просто использовать
if [ -f /dev/ttyUSB0 ]
Предполагая, что файл существует только при подключении устройства. У меня нет особого опыта в этом, поэтому я не буду размышлять о долгосрочной жизнеспособности опроса в виде файла. Я столкнулся с проблемами с отключенными устройствами и существующими записями в /dev/, поэтому следите за этим.
Ссылки для дальнейшего чтения:
http://www.tldp.org/LDP/abs/html/exit-status.html
http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html
Комментарии:
1. Я протестировал
if [ -f /dev/ttyUSB0 ]
, но он не работает с файлами разработчика
Ответ №2:
Вы можете проанализировать dmesg
вывод с помощью AWK и передать результаты скрипту Python через аргумент.
Например, эта команда передаст имена портов в скрипт print_argument.py
:
dmesg | awk '$0 ~ "attached to ttyUSB. $" { dev[$NF] = 1 } $0 ~ "disconnected from ttyUSB. $" { delete dev[$NF] } END { for(i in dev) print i }' | xargs python print_argument.py
Итак, если ваш dmesg
вывод выглядит следующим образом:
[ 5847.898803] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[ 5847.898835] ftdi_sio 1-5.1:1.0: device disconnected
[ 5979.369955] usb 1-1: new full-speed USB device number 21 using xhci_hcd
[ 5979.512177] usb 1-1: New USB device found, idVendor=0403, idProduct=6001
[ 5979.512184] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5979.512187] usb 1-1: Product: FT232R USB UART
[ 5979.512191] usb 1-1: Manufacturer: FTDI
[ 5979.512194] usb 1-1: SerialNumber: A901E5L7
[ 5979.514985] ftdi_sio 1-1:1.0: FTDI USB Serial Device converter detected
[ 5979.515064] usb 1-1: Detected FT232RL
[ 5979.515574] usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB1
И print_argument.py
содержит:
import sys
print ('/dev/' sys.argv[1])
Вывод скрипта Python из приведенной выше команды будет:
/dev/ttyUSB1