检查哪个串口已连接的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程序呢?
2 个回答
你可以用 AWK 来解析 dmesg
的输出,然后把结果通过参数传给一个 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
因为你在使用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