如何将ttyUSBX设备与USB串行设备匹配


22

选件驱动程序正确匹配USB ID,并为此设备加载驱动程序。例如

# lsusb
Bus 001 Device 002: ID 19d2:0031 ONDA Communication S.p.A. ZTE MF636
Bus 001 Device 003: ID 12d1:14ac Huawei Technologies Co., Ltd.

它还创建用于管理硬件的ttyUSBX设备

crw-rw---- 1 root uucp 188, 0 Jul  4 13:48 /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 1 Jul  4 13:49 /dev/ttyUSB1
crw-rw---- 1 root uucp 188, 2 Jul  4 13:35 /dev/ttyUSB2
crw-rw---- 1 root uucp 188, 3 Jul  4 13:37 /dev/ttyUSB3
crw-rw---- 1 root uucp 188, 4 Jul  4 13:37 /dev/ttyUSB4
crw-rw---- 1 root uucp 188, 5 Jul  4 13:37 /dev/ttyUSB5
crw-rw---- 1 root uucp 188, 6 Jul  4 13:37 /dev/ttyUSB6
crw-rw---- 1 root uucp 188, 7 Jul  4 13:37 /dev/ttyUSB7

但是,我有一个以上的USB串行设备,我想知道哪个ttyUSB用于哪个USBID。例如 / dev / ttyUSB1-> 19d2:0031

您知道我可以获得这些信息的任何时候吗?


如果您知道供应商/产品等详细信息,那么此答案很好
earcam '17

Answers:


13

看一下sysfs文件系统。我的USB串口的示例:

$ lsusb
Bus 003 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
$ ls -l /sys/bus/usb-serial/devices
lrwxrwxrwx 1 root root 0 Jul  4 17:37 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0/usb3/3-1/3-1:1.0/ttyUSB0
$ $ grep PRODUCT= /sys/bus/usb-serial/devices/ttyUSB0/../uevent
PRODUCT=67b/2303/300

如您所见,ttyUSB0映射到067b:2303我的计算机上。其他值得探索的地方是/sys/class/tty/。注意符号链接。


您做了什么使它也列出PRODUCT的工作吗?
伊戈尔·斯托帕

@IgorStoppa,尝试catuevent从结果文件find /sys -name ttyACM0,例如。替换您的串行设备的节点名称。
sherrellbc

9

您可以尝试查看您的设备是否已在/ dev / serial / by-id /下注册。

ls -l / dev / serial / by-id

这些名称应保持一致,并将指向(符号链接)正确的ttyUSBx


您可以添加一些说明,示例等吗?在SE中,单行答案并不算好
Romeo Ninov

@RomeoNinov好的,我根据您的要求添加了一些说明。这并不比仅查看另一个目录困难得多,所以我看不出答案比它更复杂将如何改善。对于那个很抱歉。
Waxhead,2017年

我有两个相同的适配器(两个Arduino)连接到Raspberry Pi。ls -l /dev/serial/by-id只返回一个适配器../../ttyUSB1,而同时ls -l /sys/bus/usb-serial/devices显示两个适配器。因此,我认为这不是一个好答案。
Daniel F

6

我有一个类似的问题

将此写入/etc/udev/rules.d/50-usb.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", SYMLINK+="ONDA"
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14ac", SYMLINK+="HUAWEI"

到最后。重启。

现在,您可以使用它/dev/ONDA来访问您的ONDA设备。

如果您希望非root用户能够使用它们,则添加

, MODE="0666"

到每一行的末尾。


我这样做并检查了它们链接到的文件。我拥有的产品具有多个接口,例如固态硬盘,USB串行接口。虽然我希望链接到/ dev / ttyACM0,但是它链接到/ dev / sda。有什么方法可以在规则文件中定义规则应适用的设备类型?我将规则写在/etc/udev/rules.d/99-ftdi.rules
nurp

好的找到它:将SUBSYSTEM ==“ tty”添加到规则参数。这个值可以在udevadm info --name=/dev/ttyACM0
nurp

3

我将使用udev并编写一些规则来创建设备的符号链接。

为了获得足够的信息来区分设备,请对所有设备尝试以下操作:

$ udevadm info --query all --name /dev/ttyUSB0 --attribute-walk

1

以下命令将为我提供与19d2:0016关联的ttyUSB设备名称列表(这是ZTE MF831 LTE记忆棒的“调制解调器模式” ID,您可能有所不同。):

    for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
        egrep -i "v19d2p0016(.*)in02" $i/../modalias >/dev/null && echo "/dev/${i##*/}"
    done

这将循环浏览/ sys / bus / usb / devices中文件名为ttyUSB *的文件列表,包括符号链接。在结果中,我们将搜索名为modalias的文件,并查找包含供应商ID“ v”“ 19d2”和产品ID“ p” 0016的字符串。如果输出匹配,我们将回显以“ / dev /”为前缀的字符串在USB前面?名称。Afaik的第一个或通常最后一个(最高编号)是ZTE设备的调制解调器端口。您可以将结果回显到/ tmp /中的文件,并在相应行的开头-n1或结尾-n1。如果有集线器,则可能需要增加最大深度。

这不是最优雅的方法,但是几乎可以在任何Linux变体上使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.