zoukankan      html  css  js  c++  java
  • 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级联用 . 连接。
    :后面应该是USB协议版本号 (猜测)。 USB协议版本号是由 USB设备枚举的时候确定的。

    其他内容

    另外, 还有个简便但是不一定非常准确的方法, 直接运行:

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

    这样也能看出个大概, 只是不知道当有两个一样的物理设备时, 这种方法会不会有问题. 至少在我的测试中是好使的, 因为我手里的几个串口都是不同的厂商出的, 所以容易区分.

  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/JiuHuan/p/11646581.html
Copyright © 2011-2022 走看看