如何在Ubuntu 10.1下识别多个USB串行适配器

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

有时,它们的/ dev / ttypath会改变(例如,如果在启动时连接了其他USB设备)。

我需要通过任何这样的改变反复引用相同的适配器的方式。

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

我认为最可能的select是确定它连接到哪个端口的适配器(它们不会移动)。

我可以find各种有趣的/开发path,但可能工作,但尽pipe所有关于udev在线的讨论,我不能find一个明确的声明,如果设备插入到一个静态端口,这些path是否是静态的。

Solutions Collecting From Web of "如何在Ubuntu 10.1下识别多个USB串行适配器"

有一个解决方案。 晚了再说再好不过了)

使用以下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-ports中,格式如下: bus_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 

问候。

$ udevadm info -n /dev/ttyUSB0 -a查看$ udevadm info -n /dev/ttyUSB0 -a你的USB设备的哪个端口被插入。其中一个父设备的变量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 

就像伊利亚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-serial设备被识别时负责正确映射。

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

我有许多USB到串行设备, 每个端口很多,上面提到的解决方案并不适合我。

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

我知道我现在提议的可能被认为是一个疯狂的黑客攻击,但它对我有用。
目前..

我真的很高兴看到一个更优雅的建议,完成类似的事情。

所以…基于以前的答案形式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 

USB设备可以让你的端口号和总线/开发枚举。

我也在搜索这个主题,以找到哪个物理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与总线2 device5(未来技术设备国际USB转串口适配器)上的设备相关联; 同样地,ttyUSB1与总线2,设备4(这是Prolific Technology公司的USB转串口适配器)上的设备相关联。

正如已经指出的那样,命令:

 $ usb-devices 

将以单行方式获得相同的信息。 我想我会发布的细节,帮助我了解幕后的工作情况

希望有帮助:)

这些设备都有相同的序列号[..]

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