Linux 如何在Ubuntu 10.1下识别多个USB串行适配器
我正在Ubuntu 10.1下从多个相同的USB串行适配器读取数据 有时,它们的/dev/tty路径会更改(例如,如果启动时连接了其他USB设备) 我需要一种通过任何此类更改重复引用同一适配器的方法 根据udevadm的说法,这些设备都有相同的序列号 我认为最有可能的选择是识别它连接到哪个端口的适配器(它们不会移动) 我可以找到各种可能有效的有趣的/dev路径,但尽管有关于udev online的所有讨论,但我找不到关于如果设备插入静态端口,这些路径中的一些是否是静态的明确声明 所有设备都具有相同的序列号[…]Linux 如何在Ubuntu 10.1下识别多个USB串行适配器,linux,ubuntu,usb,usbserial,identification,Linux,Ubuntu,Usb,Usbserial,Identification,我正在Ubuntu 10.1下从多个相同的USB串行适配器读取数据 有时,它们的/dev/tty路径会更改(例如,如果启动时连接了其他USB设备) 我需要一种通过任何此类更改重复引用同一适配器的方法 根据udevadm的说法,这些设备都有相同的序列号 我认为最有可能的选择是识别它连接到哪个端口的适配器(它们不会移动) 我可以找到各种可能有效的有趣的/dev路径,但尽管有关于udev online的所有讨论,但我找不到关于如果设备插入静态端口,这些路径中的一些是否是静态的明确声明 所有设备都具有相
usb-parse-devpath.pm通过使用适配器的总线和端口id来解决此问题。有一个解决方案。迟到总比不迟到好;) 使用以下
udev
规则将/dev/ttyUSB{?}
设备映射到/dev/usb端口/%bus\u id-%port\u id
链接
这是我的/etc/udev/rules.d/usb解析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;
}
}
因此,总线id
是3
,端口id
是1
,现在我的/dev/usb端口中有以下内容:
$ ls -al /dev/usb-ports
lrwxrwxrwx 1 root root 10 Май 12 00:26 3-1 -> ../ttyUSB0
问候。就像伊利亚·马特维奇科夫的回答一样,一个好的解决方案是添加udev规则,以便对设备执行您想要的操作。和你一样,我也有类似的问题。我在USB到多串口适配器上安装了UPS,系统偶尔会切换/dev/tty号
我的解决方案是创建一个规则,根据驱动程序和端口匹配设备的类型,然后创建一个指向我的UPS连接到的端口的符号链接。我用NUT监控UPS,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命令查找插入规则时要在规则中使用的实际设备名称。使用$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
usb设备可以获取端口号和总线/dev枚举。我也在搜索此主题,以找到将哪个物理usb设备分配/连接到逻辑/dev设备名称的方法。因此,经过一些尝试和错误,这是对我最有效的方法:
查看存在哪些逻辑ttyUSBx设备(其中x为0、1、2…):
显示所有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上的设备device4相关联,这是Prolific Technology,Inc.的USB到串行适配器
正如已经指出的,司令部:
$ usb-devices
将以单行方式为您提供相同的信息。我想我应该发布一些细节来帮助我了解这些东西是如何在幕后运作的
希望这会有所帮助:)我有很多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
我发现将print$items[$I+1]更改为print$items[$I+2]在这里更有用;因为我电脑前面的两个USB端口似乎都映射到了前面的“1-1”@詹姆斯穆萨特:谢谢你的回复。谈谈工程吧<代码>操作==“添加”,内核==“ttyUSB[0-9]*”,符号链接+=“usb端口/tty-%s{../busnum}-%s{../devpath}”
做了同样的事情。我发现这个超级用户答案非常有用:
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