如何通过Shell脚本依据序列号获取正确的ttyACMx设备号
问题
将J-Link设备(序列号000683490517)插入USB端口时,执行dmesg -wH命令得到如下输出,显示设备对应ttyACM5:
[ +9.913990] usb 3-1.2: new high-speed USB device number 8 using xhci_hcd [ +0.091634] usb 3-1.2: New USB device found, idVendor=1366, idProduct=0105, bcdDevice= 1.00 [ +0.000018] usb 3-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ +0.000008] usb 3-1.2: Product: J-Link [ +0.000007] usb 3-1.2: Manufacturer: SEGGER [ +0.000006] usb 3-1.2: SerialNumber: 000683490517 [ +0.027074] cdc_acm 3-1.2:1.0: ttyACM5: USB ACM device
但ttyACM编号会因设备连接顺序等因素变化,如何通过Shell脚本,结合lsusb等命令,依据设备序列号获取正确的ttyACMx编号?
解决方案
完全可以实现,核心逻辑是通过设备序列号定位对应的USB总线/端口路径,再关联到对应的ttyACM设备。以下是具体实现:
完整Shell脚本
#!/bin/bash # 目标设备序列号 TARGET_SERIAL="000683490517" # 1. 从lsusb输出中提取目标设备的总线和端口号(格式:总线:端口) BUS_PORT=$(lsusb -v | grep -B2 -A10 "SerialNumber.*$TARGET_SERIAL" | grep -E "Bus |Port " | awk '{print $2}' | paste -d ':' - -) if [ -z "$BUS_PORT" ]; then echo "未找到序列号为$TARGET_SERIAL的设备" exit 1 fi # 2. 遍历所有ttyACM设备,匹配对应的总线端口信息 TTY_DEVICE="" for tty in /sys/class/tty/ttyACM*; do # 读取当前tty设备对应的USB总线端口 DEV_BUS_PORT=$(readlink -f "$tty/device" | awk -F '/' '{print $(NF-1) ":" $(NF)}') if [ "$DEV_BUS_PORT" == "$BUS_PORT" ]; then TTY_DEVICE="/dev/$(basename "$tty")" break fi done # 输出结果 if [ -n "$TTY_DEVICE" ]; then echo "匹配到的设备路径:$TTY_DEVICE" else echo "未找到对应ttyACM设备" exit 1 fi
脚本说明
- 第一步通过
lsusb -v获取USB设备的详细信息,过滤出目标序列号的设备条目,提取出总线和端口号组合。 - 第二步遍历系统中所有
ttyACM设备,通过/sys/class/tty下的符号链接追溯到对应的USB设备路径,对比总线端口号完成匹配,最终得到完整的设备路径。
单行快速命令(适合临时查询)
TARGET_SERIAL="000683490517"; BUS_PORT=$(lsusb -v | grep -B2 -A10 "SerialNumber.*$TARGET_SERIAL" | grep -E "Bus |Port " | awk '{print $2}' | paste -d ':' - -); for tty in /sys/class/tty/ttyACM*; do DEV_BUS_PORT=$(readlink -f "$tty/device" | awk -F '/' '{print $(NF-1) ":" $(NF)}'); if [ "$DEV_BUS_PORT" == "$BUS_PORT" ]; then echo "/dev/$(basename "$tty")"; break; fi; done
内容的提问来源于stack exchange,提问作者Franck 38
相关产品推荐
相关产品推荐

