确定设备端口的命令(如 /dev/ttyUSB0)

确定设备端口的命令(如 /dev/ttyUSB0)

我有一个关于 Linux 端口的问题。如果我通过 USB 连接设备并想要检查其端口,则无法使用命令 lsusb 来执行此操作,该命令仅指定该总线上的总线号和设备号:

[ziga@Ziga-PC ~]$ lsusb
Bus 003 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

是否有命令可以告诉我设备直接连接的端口?到目前为止,唯一的方法是断开连接并重新连接并使用以下命令:

[ziga@Ziga-PC ~]$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    0.929510] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.378109] systemd[1]: Starting system-getty.slice.
[    4.378543] systemd[1]: Created slice system-getty.slice.
[    8.786474] usb 3-4.4: FTDI USB Serial Device converter now attached to ttyUSB0

在最后一行可以看到我的设备已连接到/dev/ttyUSB0

答案1

我不太确定你在问什么。您多次提到“端口”,但在您的示例中,您说答案是/dev/ttyUSB0,这是设备开发路径,而不是端口。所以这个答案是关于找到每个设备的开发路径。

下面是一个快速但肮脏的脚本,它遍历设备以/sys查找具有ID_SERIAL属性的 USB 设备。通常只有真正的 USB 设备才会具有此属性,因此我们可以用它进行过滤。如果我们不这样做,您会在列表中看到很多不是物理设备的东西。

#!/bin/bash

for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && exit
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && exit
        echo "/dev/$devname - $ID_SERIAL"
    )
done

在我的系统上,这会导致以下结果:

/dev/ttyACM0 - LG_Electronics_Inc._LGE_Android_Phone_VS930_4G-991c470
/dev/sdb - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/sdb1 - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/input/event5 - Logitech_USB_Receiver
/dev/input/mouse1 - Logitech_USB_Receiver
/dev/input/event2 - Razer_Razer_Diamondback_3G
/dev/input/mouse0 - Razer_Razer_Diamondback_3G
/dev/input/event3 - Logitech_HID_compliant_keyboard
/dev/input/event4 - Logitech_HID_compliant_keyboard

解释:

find /sys/bus/usb/devices/usb*/ -name dev

显示的设备在其目录中/dev有一个文件。因此我们搜索符合此条件的目录。dev/sys
 

syspath="${sysdevpath%/dev}"

我们想要目录路径,所以我们去掉/dev.
 

devname="$(udevadm info -q name -p $syspath)"

这为我们提供了与该设备/dev对应的路径。/sys
 

[[ "$devname" == "bus/"* ]] && exit

这会过滤掉不是实际设备的东西。否则你会得到 USB 控制器和集线器之类的东西。退出exit子 shell,进入循环的下一次迭代。
 

eval "$(udevadm info -q property --export -p $syspath)"

udevadm info -q property --export命令以 shell 可以将其解析为变量的格式列出所有设备属性。所以我们只是呼吁eval这一点。这也是我们将代码括在括号中的原因,以便我们使用子 shell,并且变量在每次循环时都会被擦除。
 

[[ -z "$ID_SERIAL" ]] && exit

对非实际设备的事物进行更多过滤。
 

echo "/dev/$devname - $ID_SERIAL"

我希望你知道这条线的作用:-)

答案2

如果连接到以下设备,您可以使用此命令来探索您的设备usb0

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

答案3

假设你知道你插入的设备是什么,至少在 14.04 Ubuntu 中,有一个命令usb-devices可以查看并找到信息:

$ usb-devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 3
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev=04.04
S:  Manufacturer=Linux 4.4.0-131-generic ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=0000:00:1a.0
C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub

第一行列出了总线和端口,以及lsusb给出的设备号。

答案4

您可以从 sysfs 获取所有信息,无需udevadm嵌入式 Linux 系统上不可用的其他程序。

vidpid_to_devs(){
        find $(grep -l "PRODUCT=$(printf "%x/%x" "0x${1%:*}" "0x${1#*:}")" \
                  /sys/bus/usb/devices/[0-9]*:*/uevent | sed 's,uevent$,,') \
           /dev/null -name dev -o -name dev_id |
        sed 's,[^/]*$,uevent,' |
        xargs sed -n -e s,DEVNAME=,/dev/,p -e s,INTERFACE=,,p
}

% vidpid_to_devs 067b:2303
/dev/ttyUSB0
% vidpid_to_devs 00da:8510
/dev/input/event6
/dev/input/event4
/dev/input/mouse1
/dev/input/event5
/dev/hidraw3
/dev/input/event7
/dev/hidraw4

程序是

a) 查找/sys/bus/usb/devices/*:*与您的元组匹配的设备接口vendor:product-uevent该目录中的文件包含 a PRODUCT=vendor/product/revision(全部为十六进制形式,没有前导零)。

b) 查找包含文件的任何子目录,然后从该子目录中的文件条目中dev获取设备名称。与网络接口相同。DEVNAME=ueventdev_idINTERFACE=

相关内容