장치별 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 info를 사용하여 각 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으로 재설정되고 각 반복마다 증가하는 것처럼 보입니다. 출력이 다음과 같이 보입니다. 좋다

/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 장치를 내보내려면 어떻게 해야 합니까?

관련 정보