Скрипт Bash для проверки того, какой последовательный порт подключен

#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