检查哪个串口已连接的Bash脚本

3 投票
2 回答
3072 浏览
提问于 2025-04-18 10:31

我有一个设备是通过串口连接的。我写了一个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 个回答

0

你可以用 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
0

因为你在使用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

撰写回答