选择设备的特定 ttyUSBx

选择设备的特定 ttyUSBx

我正在尝试改进一个脚本来在 Debian Linux 中连接我的蜂窝调制解调器。该调制解调器枚举了 5 个 USB 端口,我需要将特定端口用于特定目的(一个用于启动数据连接,一个用于查询信号强度等统计信息)。原始脚本文件手动选择 /dev/ttyUSB3 进行连接,但是当连接其他 USB 设备时,它们偶尔会优先为 ttyUSB0 和 ttyUSB1,这会将单元调制解调器 tty 端口向上移动,以便我可能需要使用 ttyUSB4 或 ttyUSB5,具体取决于是否存在其他设备。将端口保持静态会导致脚本在某些情况下失败。

使用lsusb,

Bus 001 Device 006: ID 2c7c:0121  

我可以看到调制解调器是总线 001 设备 006 ID:2c7c:0121
并且使用 udevadm 信息我可以手动过滤每个 ttyUSB 的属性以查看哪个设备位于哪个端口上。

echo `udevadm info --name=/dev/ttyUSB3 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d",$1,$2);print $1;}'` | tr " " "/"

给我

busnum:001/devnum:006

手动将 ttyUSB4 更改为其他端口会显示每个端口上有哪些其他设备。我找到并调整了另一个脚本,但不断出现奇怪的问题,导致其无法按预期运行。这是我当前的脚本

#!/bin/bash
myport=0
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
  (
    syspath="${sysdevpath%/dev}"
    devname="$(udevadm  info -q name -p $syspath)" 
    [[ "$devname" == "bus/"* ]] && continue
    eval "$udevadm -]info -q property --export -p $syspath)"
    if [ "$ID_VENDOR_ID" == '2c7c' ]; then
      echo "/dev/$devname - $ID_VENDORID:$ID_MODEL_ID"
      myport= `expr $myport + 1 `
      if [ $myport == 3 ]
      then
        echo $port
        port= "/dev/$devname"
      fi
    fi
  )
if [ -z $port ]
then
  echo $port
fi
done

当我运行脚本时,它会正确过滤掉与 VID 2c7c 匹配的设备,但由于某种原因,我无法在 for 循环中增加 myport 它从 0 到 1,但似乎每次迭代都会重置为 0 并增加回 1输出看起来像

/dev/ttyUSB0 - 2c7c:0121
1
/dev/ttyUSB1 - 2c7c:0121
1
/dev/ttyUSB2 - 2c7c:0121
1
/dev/ttyUSB3 - 2c7c:0121
1
/dev/ttyUSB4 - 2c7c:0121
1

如果我在 for 循环之上执行此操作,它将按预期工作

x=0
x=`expr $x + 1 `
x=`expr $x + 1 `
x=`expr $x + 1`
echo $x

将输出“3”

我需要做什么才能正确数到 3 并吐出此时关联的 /dev/ttyUSB 设备?

相关内容