Linux 綁定 ttyUSBn 串口方法。


Linux 綁定 ttyUSBn 串口方法。

在linux下, 使用usb轉串口, 經常會碰到一個問題: 如果有多個串口, 以不同順序插入的時候, /dev/ttyUSB0 /dev/ttyUSB1的索引號碼也是不同的, 這對於想要用腳本來實現設備操作的人來說, 是相當麻煩. 本文將介紹: 怎么才能知道這些索引號對應的具體是那個物理設備?

嘗試了很多種方式,最后得出結論:   直接找USB的物理路徑最好。

 

找的資料一般都是利用 VENDOR_ID、MODEL_ID 來區分。但是:

USB 設備的 VENDOR_ID、MODEL_ID 可以識別出是這個型號的USB芯片。 當系統中只有一個同芯片設備的時候很好辦。 當存在多個就為難了,一樣。無法分辨。

本來想找唯一ID,但是失敗了,不是所有USB設備都有。

 

1 獲取 USB 插接結構 和 VENDOR_ID、MODEL_ID

在終端運行命令:   lsusb -t

xx@debian:/home$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
        |__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 3: Dev 4, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M

我的主機情況是這樣的。 主機有4個USB插口。  在其中一個USB口上出入了4口HUB,再在此HUB上出入了CH340的USB 串口。

上面截圖可以看到:    硬件插線結構:

主板芯片組提供2個USB根集線集,其中一個接了8端口HUB,另一個接了4端口HUB。   都是高速HUB  480M。

  我自己的插入的4端口HUB在 ,主板內部8端口HUB下。 高速設備 480M。

    4端口HUB 下插入了使用CH341 驅動的設備。 全速設備 12M。

 

再看  lsusb

xx@debian:/home$ lsusb
Bus 002 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 002 Device 003: ID 0bda:5411 Realtek Semiconductor Corp. 
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 

可以看到: 1a86:7523  這即是我的usb轉串口設備, 冒號兩邊的數字分別對應設備的 VENDOR_ID 與 MODEL_ID 。

 

2 獲取 /dev/ttyUSBn 信息

命令 udevadm info /tty/USBn

xx@debian:/home$ udevadm info /dev/ttyUSB0
P: /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.3/2-1.1.3:1.0/ttyUSB0/tty/ttyUSB0
N: ttyUSB0
L: 0
S: serial/by-path/pci-0000:00:1d.0-usb-0:1.1.3:1.0-port0
S: serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.3/2-1.1.3:1.0/ttyUSB0/tty/ttyUSB0
E: DEVNAME=/dev/ttyUSB0
E: MAJOR=188
E: MINOR=0
E: SUBSYSTEM=tty
E: USEC_INITIALIZED=4816636
E: ID_BUS=usb
E: ID_VENDOR_ID=1a86
E: ID_MODEL_ID=7523
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_PCI_INTERFACE_FROM_DATABASE=EHCI
E: ID_VENDOR_FROM_DATABASE=QinHeng Electronics
E: ID_MODEL_FROM_DATABASE=HL-340 USB-Serial adapter
E: ID_VENDOR=1a86
E: ID_VENDOR_ENC=1a86
E: ID_MODEL=USB2.0-Serial
E: ID_MODEL_ENC=USB2.0-Serial
E: ID_REVISION=0254
E: ID_SERIAL=1a86_USB2.0-Serial
E: ID_TYPE=generic
E: ID_USB_INTERFACES=:ff0102:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=ch341
E: ID_USB_CLASS_FROM_DATABASE=Vendor Specific Class
E: ID_PATH=pci-0000:00:1d.0-usb-0:1.1.3:1.0
E: ID_PATH_TAG=pci-0000_00_1d_0-usb-0_1_1_3_1_0
E: ID_MM_CANDIDATE=1
E: DEVLINKS=/dev/serial/by-path/pci-0000:00:1d.0-usb-0:1.1.3:1.0-port0 /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
E: TAGS=:systemd:

 

P : 總線路徑。   這是我們最終想要的。

可以看到  VENDOR_ID、MODEL_ID 可以識別出是這個型號的USB芯片。  只是類型,不是設備唯一 ID 。  很多設備沒有唯一 ID。 這也是讓我很為難的地方。

 

/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1.3/2-1.1.3:1.0/ttyUSB0/tty/ttyUSB0lsusb -t 有一一對應關系。


- 前面是根集線集編號。
- 后面是端口號, hub級聯用 . 連接。
:配置描述符中配置編號 .Interface

其他內容

另外, 還有個簡便但是不一定非常准確的方法, 直接運行:

ls -lh /dev/serial/by-id/

這樣也能看出個大概, 只是不知道當有兩個一樣的物理設備時, 這種方法會不會有問題. 至少在我的測試中是好使的, 因為我手里的幾個串口都是不同的廠商出的, 所以容易區分.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM