使用 udev 规则设置不带符号链接的 USB 串行设备的持久名称

使用 udev 规则设置不带符号链接的 USB 串行设备的持久名称

因此,我在使用 USB 转串行设备时遇到了一些问题,当我的树莓派计算模块启动时,它首先枚举这个特定的 USB 转串行设备,这会“碰撞”其他 USB 转串行端口(稍后创建并代表)调制解调器/GPS 的多个端口。

因此,默认情况下,在没有连接 USB 转串行设备的情况下,我的端口看起来像这样:

/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3

当我将此 USB 连接到串行设备时,它会按如下方式添加:

/dev/ttyUSB4

但是,如果我重新启动或关机然后启动备份,列表将显示相同,除了我之前提到的 USB 转串行设备,该设备曾经是 ttyUSB4,现在位于 ttyUSB0。这就是我所说的端口被“碰撞”的意思。

我尝试通过添加以下行来编辑 udev local.rules 文件。

ACTION==“添加”,ATTRS {idVendor} ==“0403”,ATTRS {idProduct}==“6015”,SYMLINK + =“usbgps”

我也尝试过这条线,但这条线似乎不起作用。

操作==“添加”,ATTRS {idVendor} ==“0403”,ATTRS {idProduct}==“6015”,NAME + =“usbgps”

创建符号链接的第一行有效,它创建了一个位于 /dev/usbgps 的新设备/链接。

这可以工作,但原始设备仍然保留,即它创建 usbgps 符号链接,但它也创建 /dev/ttyUSB4 设备。重新启动后,它会显示为 /dev/ttyUSB0 并“碰撞”其他端口,这会弄乱我拥有的其他软件。

从长远来看,我将尝试对我的软件正在访问的设备使用特定的静态名称。问题是 ttyUSB0/1/2/3 端口是由调制解调器制造商的特殊驱动程序创建的。因此,我可能需要修改代码,以便能够使用直接符号链接显示四个 USB 转串口。即 ttyUSB2 用于 pppd/cellular,所以我将其命名为 cellport,ttyUSB1 用于 gps,所以我将其命名为 gpsport 等等。

如果有人知道如何在不修改驱动程序的情况下使 ttyUSB0/1/2/3 端口具有直接符号链接,请告诉我。

所以我要问的最终问题是:

如何使我的 USB 设备显示为 usbgps,而不使其也显示为 ttyUSB4 或 ttyUSB0 端口名称。我只希望设备显示为 usbgps。如果我可以阻止它被添加到 ttyUSB 设备列表中,那么我就可以阻止它碰撞端口并弄乱依赖于具有特定名称的端口的其他应用程序。

答案1

好吧,我想我通过关注这篇文章解决了这个问题。

USB 串行“按路径”的 udev 规则不起作用

我启动了所有连接的计算模块,端口显示如下,并附有端口代表的描述。

ttyUSB0 -> USB GPS ttyUSB1 -> 调制解调器端口 0 ttyUSB2 -> 调制解调器 GPS 端口 ttyUSB3 -> 用于 pppd 的调制解调器蜂窝端口 ttyUSB4 -> 命令端口处的调制解调器

然后我运行以下命令并记录输出:

udevadm info /dev/ttyUSB0 | grep "ID_PATH="
udevadm info /dev/ttyUSB1 | grep "ID_PATH="
udevadm info /dev/ttyUSB2 | grep "ID_PATH="
udevadm info /dev/ttyUSB3 | grep "ID_PATH="
udevadm info /dev/ttyUSB4 | grep "ID_PATH="

这些命令的输出如下所示:

platform-fe980000.usb-usb-0:1.1:1.0
platform-fe980000.usb-usb-0:1.3:1.0
platform-fe980000.usb-usb-0:1.3:1.1
platform-fe980000.usb-usb-0:1.3:1.2
platform-fe980000.usb-usb-0:1.3:1.3

然后我记下此信息并将以下行添加到 /etc/udev/rules.d/local.rules 文件中。将来我会将这些规则添加到同一rules.d文件夹中的另一个规则文件中,而不是将其放在local.rules文件中。

SUBSYSTEM=="tty",ENV{ID_PATH}=="platform-fe980000.usb-usb- 
0:1.1:1.0",SYMLINK+="usbgps"
SUBSYSTEM=="tty",ENV{ID_PATH}=="platform-fe980000.usb-usb- 
0:1.3:1.0",SYMLINK+="modemport0"
SUBSYSTEM=="tty",ENV{ID_PATH}=="platform-fe980000.usb-usb- 
0:1.3:1.1",SYMLINK+="modemgpsport"
SUBSYSTEM=="tty",ENV{ID_PATH}=="platform-fe980000.usb-usb- 
0:1.3:1.2",SYMLINK+="modemcellularport"
SUBSYSTEM=="tty",ENV{ID_PATH}=="platform-fe980000.usb-usb- 
0:1.3:1.3",SYMLINK+="modemcommandport"

现在,当计算模块启动时,ttyUSB0/1/2/3/4/5 端口可以移动,但因为符号链接指向 USB 设备的 ID_PATH,所以这似乎并不重要。我可以重新启动模块或关闭并重新启动,一切都会按我的预期进行。

举个例子,如果我想打开并查看来自 usbgps 端口的 GPS 数据。

我曾经运行此命令来查看 USB GPS 数据:

picocom /dev/ttyUSB0 -b 9600

现在我可以运行相同的命令,但让它指向符号链接,并且它可以完美地工作。

picocom /dev/usbgps -b 9600

我不确定这是否是最好的解决方案,但至少我有一个似乎运行良好的解决方案。

如果您对更好的解决方案有任何想法,请发布。

相关内容