Usb

用於確定設備埠的命令(如 /dev/ttyUSB0)

  • October 22, 2021

我對 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**。

我不太確定你在問什麼。您多次提到“埠”,但在您的範例中,您說答案是/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"

我希望你知道這條線是做什麼的:-)

引用自:https://unix.stackexchange.com/questions/144029