一致的Linux设备枚举


13

在我们的Linux框中,我们有USB->串行设备,该设备始终标识为 /dev/ttyACM0。因此,我编写了一个应用程序,直到昨天,一切正常。但是突然之间(是的,在远程演示中...),该设备停止了工作。经过快速研究,我发现连接更改为/dev/ttyACM1。有点不合时宜,但是现在我遇到了一个问题-如何明确识别我的设备?例如,尽管/dev/sd**已更改,但可以使用UUID初始化存储驱动器。有什么方法可以对串行设备执行此操作?

现在,我使用一个愚蠢的解决方法:

for(int i = 0; i < 10; i ++)
{
    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}

指向我们使用的设备的链接

Answers:


19

由于我们在谈论USB设备并假设您具有udev,因此可以设置一些udev规则。

我猜,这只是一个疯狂的猜测,有人或某事拔出/拔出了设备,然后将其重新插入/添加了设备,这增加了数字。

现在,首先需要供应商和产品ID:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC

接下来,您需要序列号(如果有多个):

# udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
    ATTRS{serial}=="A6008isP"

现在,让我们创建一个udev规则:

UDEV规则通常分散在中的许多文件中/etc/udev/rules.d。创建一个名为的新文件99-usb-serial.rules,并将以下行放入其中,我有三个设备,每个设备都有不同的序列号:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

ls -l /dev/MySerialDevice
lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1

如果您不希望使用序列号,则来自供应商的具有相同芯片的任何设备都将获得相同的符号链接,在任何给定时间只能插入一个。

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MySerialDevice"

从这里取


3
如果您有最新的Linux发行版,则很可能已经自动将设备创建为/dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0。如果没有自定义udev规则,这对您就足够了。
约瑟夫说,请

1
不幸的是,许多无名设备都具有序列号“ 0123456789abcdef”。那就是它变得有趣的地方。
mosvy

@mosvy序列号不可更改吗?
OganM

@OganM它们可能会更改...如果您能够根植设备。
mosvy
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.