如何在连接时为串行设备指定自定义名称?

如何在连接时为串行设备指定自定义名称?

我正在研究活性氧在下面乌班图14.04在一个奥德罗伊XU3(ARM 开发板)。

我将两个 USB 设备连接到我的开发板,它们被识别为ttyACM0ttyACM1根据它们连接的时间。

由于这些设备(Arduino 和 PixHawk)具有不同的 PID / VID,我想将它们绑定到某个“自定义名称”tty,例如tty控制器0&tty位置0例如。

根据这个主题,我们可以根据 PID 和 VID 来模拟链接设备ttyUSB0

我应该如何模拟链接到确定性名称?/etc/udev/rules.d/99-custom.rulessimlink中的 4 条规则可以工作吗?

ACTION=="add", ATTRS{idVendor}=="0123", ATTRS{idProduct}=="0001", RUN+="/bin/ln -s /dev/ttyACM0 /dev/ttyController"


ACTION=="remove", ATTRS{idVendor}=="0123", ATTRS{idProduct}=="0001", RUN+="/bin/rm /dev/ttyController"


ACTION=="add", ATTRS{idVendor}=="3210", ATTRS{idProduct}=="0002", RUN+="/bin/ln -s /dev/ttyACM0 /dev/ttyPosition"


ACTION=="remove", ATTRS{idVendor}=="3210", ATTRS{idProduct}=="0002", RUN+="/bin/rm /dev/ttyPosition"

或者我可以将 Udev 与自定义 PID 和 VID 一起使用吗?

答案1

您的配置应该基本上可以工作,但我想提出一些建议:

首先,我认为你想使用ATTR,而不是ATTRSATTRS向上搜索整个设备树以找到匹配的(父)设备。这很可能不是您想要的。使用ATTR实际触发事件的设备必须具有指定的属性。

其次,由于创建设备节点的符号链接是一项相当常见的任务,因此有一个专门的语句来执行此操作,即SYMLINK+="newname".这样您就不会依赖“外部”命令。更重要的是,通过使用此指令,您只需要匹配“add”事件,因为udevd当设备消失时会自动删除关联的符号链接。

因此,你的规则应该是

ACTION=="add", ATTR{idVendor}=="0123", ATTR{idProduct}=="0001", SYMLINK+="ttyController"
ACTION=="add", ATTR{idVendor}=="3210", ATTR{idProduct}=="0002", SYMLINK+="ttyPosition"

最后,我建议通过添加进一步的 SUBSYSTEM 约束来缩小匹配范围,即添加SUBSYSTEM=="usb".由于设备和供应商 ID 仅(希望)在其范围内是唯一的,因此忽略子系统匹配可能会导致您的规则在其他设备类(如 PCI 设备)上匹配。尽管这种情况不太可能发生,但它在 udev 规则中通常被视为良好的风格:

SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="0123", ATTR{idProduct}=="0001", SYMLINK+="ttyController"
SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="3210", ATTR{idProduct}=="0002", SYMLINK+="ttyPosition"

相关内容