Linux 如何在 Ubuntu 10.1 下识别多个 USB 串口适配器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4800099/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to identify multiple USB-serial adapters under Ubuntu 10.1
提问by user589888
I am reading data from multiple identical USB-serial adapters under Ubuntu 10.1.
我正在 Ubuntu 10.1 下从多个相同的 USB 串行适配器读取数据。
On occasion, their /dev/tty path changes (eg if other USB devices are connected on startup).
有时,它们的 /dev/tty 路径会发生变化(例如,如果在启动时连接了其他 USB 设备)。
I need a way of repeatedly referring to the same adapter through any such changes.
我需要一种通过任何此类更改重复引用同一个适配器的方法。
The devices all have the same serial numbers, according to udevadm.
据 udevadm 称,这些设备都具有相同的序列号。
I think the most likely option is to identify an adapter by which port it is connected to (they don't get moved around).
我认为最可能的选择是通过它连接到的端口来识别适配器(它们不会移动)。
I can find all sorts of interesting /dev paths that might work, but despite all the discussion about udev online, I can't locate a definitive statement about whether some of these paths are static if the device is plugged into a static port.
我可以找到各种可能有效的有趣的 /dev 路径,但是尽管在网上有关于 udev 的所有讨论,但我无法找到关于如果设备插入静态端口时这些路径中的某些路径是否为静态的明确声明。
回答by Turbo J
The devices all have the same serial numbers [..]
这些设备都具有相同的序列号 [..]
The usb-parse-devpath.pm addresses this by using the bus and port id of the adapter.
usb-parse-devpath.pm 通过使用适配器的总线和端口 id 来解决这个问题。
回答by Ilya Matveychikov
There is a solution. It's better late then never ;)
有一个解决方案。迟到总比没有好;)
Use the following udev
rule to map /dev/ttyUSB{?}
devices into the /dev/usb-ports/%bus_id-%port_id
link.
使用以下udev
规则将/dev/ttyUSB{?}
设备映射到/dev/usb-ports/%bus_id-%port_id
链路中。
Here is my /etc/udev/rules.d/usb-parse-devpath.rules:
这是我的 /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"
And the usb-parse-devpath.pm
script:
和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;
}
}
As you can see this helps us to create named links to /dev/ttyUSB{?}
devices and place them at /dev/usb-ports
in the following format: bus_id-port_id
.
如您所见,这有助于我们创建指向/dev/ttyUSB{?}
设备的命名链接并将它们放置/dev/usb-ports
在以下格式中:bus_id-port_id
.
For example, the next command gives me the following:
例如,下一个命令给了我以下内容:
$ udevadm info --query=path --name=/dev/ttyUSB0
/devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/ttyUSB0/tty/ttyUSB0
So, the bus_id
is 3
and port_id
is 1
and now I have following in my /dev/usb-ports
:
那么,bus_id
是3
和port_id
是1
,现在我在有如下/dev/usb-ports
:
$ ls -al /dev/usb-ports
lrwxrwxrwx 1 root root 10 Май 12 00:26 3-1 -> ../ttyUSB0
Regards.
问候。
回答by Suncat2000
Much like Ilya Matvejchikov's answer, a good solution is to add udev rules to do what you want with the device. Like you, I was having a similar problem. I had a UPS on a USB-to-multi-serial adapter and occasionally the system would switch around the /dev/tty numbers.
就像 Ilya Matvejchikov 的回答一样,一个很好的解决方案是添加 udev 规则以使用设备执行您想要的操作。和你一样,我也遇到了类似的问题。我在 USB-to-multi-serial 适配器上有一个 UPS,偶尔系统会切换 /dev/tty 数字。
My solution was to create a rule to match the type of device by driver and port, then create a symbolic link to the port to which my UPS was attached. I used NUT to monitor the UPS, which was always plugged into the same physical port.
我的解决方案是创建一个规则来匹配驱动程序和端口的设备类型,然后创建一个符号链接到我的 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"
Now I configure NUT to always use a constant /dev/nut-ups0, as the serial port and the rule takes care of mapping properly when the usb-serial device is recognized.
现在我将 NUT 配置为始终使用常量 /dev/nut-ups0,因为串行端口和规则会在识别 USB 串行设备时正确处理映射。
You can use the lsusb command to find out the actual device name to use in the rule when it's plugged in.
您可以使用 lsusb 命令找出插入规则时要在规则中使用的实际设备名称。
回答by mickeyrourkeske
Look with $ udevadm info -n /dev/ttyUSB0 -a
which port your USB device is plugged in. The variable KERNELS of one of the parent devices should be something like KERNELS=="1-1.2:1.0".
查看$ udevadm info -n /dev/ttyUSB0 -a
您的 USB 设备插入的端口。其中一个父设备的变量 KERNELS 应该类似于 KERNELS=="1-1.2:1.0"。
Create a udev rule:
创建 udev 规则:
SUBSYSTEM=="tty", KERNELS=="1-1.2:1.0", SYMLINK+="ttyUSB42"
SUBSYSTEM=="tty", KERNELS=="1-1.3:1.0", SYMLINK+="usb-serial"
and trigger udev
并触发 udev
$ udevadm trigger
回答by richmb
usb-devices can get you the port number and the bus/dev enumeration.
usb-devices 可以为您提供端口号和总线/开发枚举。
回答by GOTIL
I too was searching this topic for a way to find which physical USB device was assigned/connected to a logical /dev device name. So, after some trial and error, this is what worked best for me:
我也在搜索这个主题,寻找一种方法来查找哪个物理 USB 设备被分配/连接到逻辑 /dev 设备名称。因此,经过反复试验,这对我来说最有效:
See what logical ttyUSBx devices exist (where x is 0, 1, 2...):
查看存在哪些逻辑 ttyUSBx 设备(其中 x 是 0、1、2...):
$ ls /dev
Show bus and device numbers for all usb-serial adapters:
显示所有 USB 串行适配器的总线和设备编号:
$ lsusb
Finally, use:
最后,使用:
$ udevadm info --name=ttyUSBx --attribute-walk | grep num
Now inspect the udevadm output to match the logical device name to the actual physical device. Here my listing when I did it:
现在检查 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"
So, in my case, ttyUSB0 is associated with the device on bus2, device5, which is the Future Technology Devices International USB to Serial Adapter; and likewise, ttyUSB1 is associated with the device on bus2, device4, which is the Prolific Technology, Inc. USB to Serial adapter.
因此,就我而言,ttyUSB0 与 bus2 上的设备 device5 相关联,即 Future Technology Devices International USB to Serial Adapter;同样,ttyUSB1 与 bus2 上的设备 device4 相关联,即 Prolific Technology, Inc. USB 转串行适配器。
And as has been pointed out, the command:
正如已经指出的,命令:
$ usb-devices
Will get you the same info in a one-line manner. I thought I'd post the details that helped me learn how the stuff worked behind the scenes...
将以单行方式为您提供相同的信息。我想我会发布帮助我了解这些东西在幕后工作的细节......
Hope that was helpful :)
希望这有帮助:)
回答by Nicolas Tremblay
I have many USB to Serial devices with eachmany ports and the solutions mentioned above did not quite did it for me.
我有很多USB与串行设备的每个许多港口和上面提到的也不太为我做的解决方案。
The USB "KERNEL" was not enough in my case, but I found the port number.
就我而言,USB“内核”还不够,但我找到了端口号。
I am aware that what I'm proposing now might be considered an insane hack,
but it works for me..
for now..
我知道我现在提出的建议可能被认为是一个疯狂的黑客,但它对我有用..
现在..
I would actually be pleased to see a more elegant suggestion that accomplish something similar..
我实际上很高兴看到一个更优雅的建议来完成类似的事情。
So... Based on the previous answer form Ilya Matveychikov
所以...基于之前的回答形式 Ilya Matveychikov
File: /etc/udev/rules.d/usb-parse-devpath.sh
文件:/etc/udev/rules.d/usb-parse-devpath.sh
#!/bin/bash
DEVNUM=$(echo "" | rev | cut -d'/' -f4 | rev | tr -d '-' | tr -d '.' | tr -d ':')
PORTNUM=$(/sbin/udevadm info -a --path= | grep "ATTRS{port_number}" | head -1 | cut -d'"' -f2)
PRODUCT=$(/sbin/udevadm info -a --path= | grep "ATTRS{product}" | head -1 | cut -d'"' -f2 | tr -d '/' | tr ' ' '_')
NEWID="ttyUSB_${PRODUCT}_${DEVNUM}${PORTNUM}"
#echo "${NEWID} :: " >> /tmp/DEBUG_udev.txt
echo "$NEWID"
And File: /etc/udev/rules.d/99-usb-serial.rules
和文件:/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"
The result look something like this:
结果如下所示:
# 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