【问题标题】:How to identify multiple USB-serial adapters under Ubuntu 10.1如何在 Ubuntu 10.1 下识别多个 USB 串口适配器
【发布时间】:2011-06-15 13:35:13
【问题描述】:

我正在 Ubuntu 10.1 下从多个相同的 USB 串行适配器读取数据。

有时,它们的 /dev/tty 路径会发生变化(例如,如果在启动时连接了其他 USB 设备)。

我需要一种通过任何此类更改重复引用同一个适配器的方法。

根据 udevadm,这些设备都具有相同的序列号。

我认为最有可能的选择是识别适配器通过哪个端口连接(它们不会四处移动)。

我可以找到各种可能有效的有趣 /dev 路径,但尽管在线讨论了有关 udev 的所有讨论,但如果设备插入静态,我无法找到关于其中一些路径是否为静态的明确声明港口。

【问题讨论】:

标签: linux ubuntu usb usbserial identification


【解决方案1】:

所有设备都具有相同的序列号 [..]

usb-parse-devpath.pm 通过使用适配器的总线和端口 ID 来解决这个问题。

【讨论】:

    【解决方案2】:

    有一个解决方案。迟到总比不做好;)

    使用以下udev 规则将/dev/ttyUSB{?} 设备映射到/dev/usb-ports/%bus_id-%port_id 链接。

    这是我的/etc/udev/rules.d/usb-parse-devpath.rules:

    ACTION=="add", KERNEL=="ttyUSB[0-9]*", PROGRAM="/etc/udev/rules.d/usb-parse-devpath.pm %p", SYMLINK+="usb-ports/%c"
    

    还有usb-parse-devpath.pm 脚本:

    #!/usr/bin/perl -w
    
    @items = split("/", $ARGV[0]);
    for ($i = 0; $i < @items; $i++) {
        if ($items[$i] =~ m/^usb[0-9]+$/) {
            print $items[$i + 1] . "\n";
            last;
        }
    }
    

    如您所见,这有助于我们创建指向/dev/ttyUSB{?} 设备的命名链接,并将它们按以下格式放置在/dev/usb-portsbus_id-port_id

    例如,下一个命令给了我以下内容:

    $ udevadm info --query=path --name=/dev/ttyUSB0
    /devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/ttyUSB0/tty/ttyUSB0
    

    所以,bus_id3port_id1,现在我的 /dev/usb-ports 中有关注:

    $ ls -al /dev/usb-ports
    lrwxrwxrwx  1 root root   10 Май 12 00:26 3-1 -> ../ttyUSB0
    

    问候。

    【讨论】:

    • 我发现这里把 print $items[$i + 1] 改为 print $items[$i + 2] 更有用;因为我电脑前面的两个 USB 端口似乎都映射到前者下的“1-1”!
    • @JamesMuscat:谢谢你的回复。
    • 谈工程! ACTION=="add", KERNEL=="ttyUSB[0-9]*", SYMLINK+="usb-ports/tty-%s{../busnum}-%s{../devpath}" 做同样的事情。
    【解决方案3】:

    很像 Ilya Matvejchikov 的回答,一个很好的解决方案是添加 udev 规则以使用设备执行您想要的操作。和你一样,我也遇到了类似的问题。我在 USB 转多串口适配器上有一个 UPS,偶尔系统会切换 /dev/tty 号码。

    我的解决方案是创建一个规则以按驱动程序和端口匹配设备类型,然后创建一个符号链接到我的 UPS 所连接的端口。我使用 NUT 来监控 UPS,它总是插入同一个物理端口。

    # File contents of /etc/udev/rules.d/75-nut-ups.rules
    # Create /dev/nut-ups0 to use as a persistent serial device that can be used
    # reliably by nut to communicate with a UPS attached to the system.
    # The UPS is attached to the first port of a MosSemiconductor dual USB
    # serial adapter.
    KERNELS=="ttyUSB*", SUBSYSTEMS=="usb-serial", DRIVERS=="moschip7720", ATTRS{port_number}=="0", SYMLINK+="nut-ups0"
    

    现在我将 NUT 配置为始终使用常量 /dev/nut-ups0,因为串行端口和规则负责在识别 USB 串行设备时正确映射。

    您可以使用 lsusb 命令找出插入规则时要在规则中使用的实际设备名称。

    【讨论】:

      【解决方案4】:

      使用$ udevadm info -n /dev/ttyUSB0 -a 查看您的 USB 设备插入了哪个端口。其中一个父设备的变量 KERNELS 应该类似于 KERNELS=="1-1.2:1.0"。

      创建一个udev规则:

      SUBSYSTEM=="tty", KERNELS=="1-1.2:1.0", SYMLINK+="ttyUSB42"
      SUBSYSTEM=="tty", KERNELS=="1-1.3:1.0", SYMLINK+="usb-serial"
      

      并触发udev

      $ udevadm trigger
      

      【讨论】:

        【解决方案5】:

        usb-devices 可以获得端口号和总线/设备枚举。

        【讨论】:

          【解决方案6】:

          我也在搜索这个主题,以寻找一种方法来查找哪个物理 USB 设备已分配/连接到逻辑 /dev 设备名称。所以,经过一些试验和错误,这对我来说是最有效的:

          查看存在哪些逻辑 ttyUSBx 设备(其中 x 为 0、1、2...):

          $ ls /dev
          

          显示所有 USB 串行适配器的总线和设备编号:

          $ lsusb 
          

          最后,使用:

          $ udevadm info --name=ttyUSBx --attribute-walk | grep num  
          

          现在检查 udevadm 输出以将逻辑设备名称与实际物理设备匹配。这是我做的时候的清单:

          $ lsusb
          Bus 002 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial     (UART) IC
          Bus 002 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
          Bus 002 Device 002: ID 80ee:0021  
          Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
          Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
          
          $ udevadm info --name=ttyUSB0 --attribute-walk | grep num
              ATTRS{port_number}=="0"
              ATTRS{urbnum}=="812"
              ATTRS{busnum}=="2"
              ATTRS{devnum}=="5"
              ATTRS{urbnum}=="115"
              ATTRS{busnum}=="2"
              ATTRS{devnum}=="1"
              ATTRS{numa_node}=="-1"
          
          $ udevadm info --name=ttyUSB1 --attribute-walk | grep num
              ATTRS{port_number}=="0"
              ATTRS{urbnum}=="465"
              ATTRS{busnum}=="2"
              ATTRS{devnum}=="4"
              ATTRS{urbnum}=="115"
              ATTRS{busnum}=="2"
              ATTRS{devnum}=="1"
              ATTRS{numa_node}=="-1"
          

          所以,在我的例子中,ttyUSB0 与 bus2 上的设备 device5 相关联,即 Future Technology Devices International USB to Serial Adapter;同样,ttyUSB1 与 bus2 上的设备 device4 相关联,该设备是 Prolific Technology, Inc. USB 到串行适配器。

          正如已经指出的,命令:

          $ usb-devices
          

          将以单行方式为您提供相同的信息。我想我会发布有助于我了解幕后工作原理的详细信息...

          希望对您有所帮助:)

          【讨论】:

            【解决方案7】:

            我有很多 USB 转串口设备,每个有很多端口和解决方案 上面提到的对我来说并没有完全做到。

            USB“内核”在我的情况下是不够的,但我找到了端口号。

            我知道我现在提出的建议可能被认为是疯狂的黑客攻击, 但它对我有用..
            现在..

            我真的很高兴看到更优雅的建议 完成类似的事情..

            所以...基于之前的回答形式 Ilya Matveychikov

            文件:/etc/udev/rules.d/usb-parse-devpath.sh

            #!/bin/bash
            
            DEVNUM=$(echo "${1}" | rev | cut -d'/' -f4 | rev | tr -d '-' | tr -d '.' | tr -d ':')
            PORTNUM=$(/sbin/udevadm info -a --path=${1} | grep "ATTRS{port_number}" | head -1 | cut -d'"' -f2)
            PRODUCT=$(/sbin/udevadm info -a --path=${1} | grep "ATTRS{product}" | head -1 | cut -d'"' -f2 | tr -d '/' | tr ' ' '_')
            
            NEWID="ttyUSB_${PRODUCT}_${DEVNUM}${PORTNUM}"
            
            #echo "${NEWID} :: $1" >> /tmp/DEBUG_udev.txt
            
            echo "$NEWID"
            

            和文件:/etc/udev/rules.d/99-usb-serial.rules

            ACTION=="add", KERNEL=="ttyUSB[0-9]*", PROGRAM="/etc/udev/rules.d/usb-parse-devpath.sh %p", SYMLINK+="TTYUSBs/%c"
            

            结果如下所示:

            # ls -l /dev/TTYUSBs
            
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435100 -> ../ttyUSB20
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435101 -> ../ttyUSB21
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435102 -> ../ttyUSB22
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435103 -> ../ttyUSB23
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435104 -> ../ttyUSB24
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435105 -> ../ttyUSB25
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435106 -> ../ttyUSB26
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_435107 -> ../ttyUSB27
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436100 -> ../ttyUSB28
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436101 -> ../ttyUSB29
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436102 -> ../ttyUSB30
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436103 -> ../ttyUSB31
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436104 -> ../ttyUSB32
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436105 -> ../ttyUSB33
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436106 -> ../ttyUSB34
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport416_436107 -> ../ttyUSB35
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport4_4341100 -> ../ttyUSB38
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport4_4341101 -> ../ttyUSB39
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport4_4342100 -> ../ttyUSB36
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport4_4342101 -> ../ttyUSB37
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_421100 -> ../ttyUSB2
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_421101 -> ../ttyUSB3
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_422100 -> ../ttyUSB4
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_422101 -> ../ttyUSB5
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport8_423100 -> ../ttyUSB18
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Edgeport8_423101 -> ../ttyUSB19
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_424100 -> ../ttyUSB0
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Edgeport8_424101 -> ../ttyUSB1
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_431100 -> ../ttyUSB6
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_431101 -> ../ttyUSB7
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_431102 -> ../ttyUSB8
            lrwxrwxrwx. 1 root root 10 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_431103 -> ../ttyUSB9
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_432100 -> ../ttyUSB10
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_432101 -> ../ttyUSB11
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_432102 -> ../ttyUSB12
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_432103 -> ../ttyUSB13
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_433100 -> ../ttyUSB14
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_433101 -> ../ttyUSB15
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_433102 -> ../ttyUSB16
            lrwxrwxrwx. 1 root root 11 Jan  5 18:46 ttyUSB_Keyspan_USA-49WG_433103 -> ../ttyUSB17
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-06
              • 2017-09-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多