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

71G*_*1GA 74 usb serial-port dmesg

我有一个关于 Linux 端口的问题。如果我通过 USB 连接我的设备并想检查它的端口,我不能使用命令 lsusb 来完成它,它只指定了该总线上的总线编号和设备编号:

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

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

[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
Run Code Online (Sandbox Code Playgroud)

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

phe*_*mer 106

我不太确定你在问什么。您多次提到“端口”,但是在您的示例中,您说答案是/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
Run Code Online (Sandbox Code Playgroud)

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

/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
Run Code Online (Sandbox Code Playgroud)

解释:

find /sys/bus/usb/devices/usb*/ -name dev
Run Code Online (Sandbox Code Playgroud)

出现的设备在其目录中/dev有一个dev文件/sys。所以我们搜索符合这个条件的目录。
 

syspath="${sysdevpath%/dev}"
Run Code Online (Sandbox Code Playgroud)

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

devname="$(udevadm info -q name -p $syspath)"
Run Code Online (Sandbox Code Playgroud)

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

[[ "$devname" == "bus/"* ]] && exit
Run Code Online (Sandbox Code Playgroud)

这会过滤掉不是实际设备的东西。否则你会得到像 USB 控制器和集线器这样的东西。所述exit退出子外壳,其流向循环的下一次迭代。
 

eval "$(udevadm info -q property --export -p $syspath)"
Run Code Online (Sandbox Code Playgroud)

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

[[ -z "$ID_SERIAL" ]] && exit
Run Code Online (Sandbox Code Playgroud)

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

echo "/dev/$devname - $ID_SERIAL"
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你。我将从您的回答中学到很多东西,现在我发现这些术语对我来说并不完全清楚。有没有更短的方法?也许是一个已经集成在 Linux 中的命令? (2认同)
  • 建议将 /bin/bash 更改为 /bin/sh 并删除 ( ) 以获得最大兼容性 (2认同)

小智 17

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

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
Run Code Online (Sandbox Code Playgroud)


小智 10

假设你知道你插入的设备是什么,至少在 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
Run Code Online (Sandbox Code Playgroud)

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

  • 有没有办法从这些信息中获取“/dev/...”名称? (9认同)
  • 这不显示 `/dev/*` 路径 (5认同)

小智 5

我发现 @phemmer 接受的答案通常很有帮助,并将其转换为 bash 脚本。我添加了 shell 进程后台,以使其对于连接到系统的大量 USB 设备运行得更快(这在最有用的时候)。

#!/bin/bash                                                            
#findusbdev.sh
                                                           
if [[ "$1" =~ ^(-h|--help)$ ]]; then                                   
                                                                       
echo "Find which USB devices are associated with which /dev/ nodes     
Usage:                                                                 
  $0 [-h|--help] [searchString]                                        
                                                                       
  -h | --help   Prints this message                                    
  searchString  Print only /dev/<device> of matching output            
                With no arguments $0 prints information for all        
                possible USB device nodes                              
                                                                       
E.g. $0 \"FTDI_FT232\" - will show /dev/ttyUSBX for a device using     
the FTDI FT232 chipset.                                                
"                                                                      
    exit 0                                                             
fi                                                                     
                                                                       
devs=$( (                                                              
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev ); do    
    # ( to launch a subshell here                                      
    (                                                                  
        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"                              
    )& # & here is causing all of these queries to run simultaneously  
done                                                                   
# wait then gives a chance for all of the iterations to complete       
wait                                                                   
# output order is random due to multiprocessing so sort results        
) | sort )                                                             
                                                                       
                                                                       
if [ -z "$1" ]; then                                                   
    echo "${devs}"                                                     
else                                                                   
    echo "${devs}" | grep "$1" | awk '{print $1}'                      
fi                                                                     

Run Code Online (Sandbox Code Playgroud)

用法示例:

$ ./findusbdev.sh 
/dev/input/event15 - Peppercon_AG_Multidevice_E999EC989B0BAFB78F9F225288EC6B0A
/dev/input/event16 - Peppercon_AG_Multidevice_E999EC989B0BAFB78F9F225288EC6B0A
/dev/input/mouse0 - Peppercon_AG_Multidevice_E999EC989B0BAFB78F9F225288EC6B0A
/dev/ttyUSB0 - FTDI_FT230X_Basic_UART_D308B2AI
/dev/ttyUSB1 - FTDI_FT232R_USB_UART_AH07DPSR
Run Code Online (Sandbox Code Playgroud)
$ ./findusbdev.sh FT230X
/dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
$ ./findusbdev.sh -h
Find which USB devices are associated with which /dev/ nodes
Usage:
  ./findusbdev.sh [-h|--help] [searchString]

  -h | --help   Prints this message
  searchString  Print only /dev/<device> of matching output
                With no arguments ./findusbdev.sh prints information for all 
                possible USB device nodes

E.g. ./findusbdev.sh "FTDI_FT232" - will show /dev/ttyUSBX for a device using 
the FTDI FT232 chipset.

Run Code Online (Sandbox Code Playgroud)