我有一堆设备(大约 20 个)连接到远程服务器上的 USB 集线器。这些是内置于一些原型设备的开发 ESP32 板。这些设备在白天在现场(一家小工厂)进行测试,晚上重新连接到集线器,这样我就可以读取设备的日志并执行固件更新。它们在 /dev 中显示为 /dev/ttyACMn。您可以想象,将 /dev/ttyACM0 设置为 /dev/ttyACM18 会很乱。所以我在 udev 规则中做了类似的事情:
SUBSYSTEM=="tty", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", PROGRAM="/etc/udev/rules.d/my-serial.sh" SYMLINK+="ttyESP32-%c
其中 my-serial.sh 是:
serial_number=$(echo "$ID_SERIAL_SHORT" | tr -d ':')
modified_serial="${serial_number: -6}"
echo "$modified_serial"
因此,它所做的就是根据设备序列号(实际上就是设备的 WiFi MAC 地址)创建指向 /dev/ttyACMx 的符号链接。所以现在我有了一个区分设备的实用方法。我使用 /dev/ttyESP32-C9A442 等设备,而不是 /dev/ttyACM0(可能会以随机方式枚举)。
但...
该符号链接的行为与原始 ttyACM0 不同。示例:
- 当输入“screen /dev/ttyESP32-C9A442”来连接终端时,bash 不会自动完成设备名称。它会自动完成 /dev/ttyACM0。都有效正如预期的那样。
- 用于刷新设备的工具(esptool、pio)失败出现错误:“无法在所选端口上找到主板。请检查您是否选择了正确的端口。”当使用 /dev/ttyESP32-C9A442 时,但使用 /dev/ttyACM0 则没有问题。
所以我的问题是:是否存在像 /dev/ttyACM0 这样的文件属性,它不会延续到其符号链接?由于它在 bash 终端和特定工具中都会引起问题,我猜它们在某些基本属性上有所不同。有什么想法可以解决这个问题吗?
PS /dev/ttyACM0 归 root:plugdev 所有,并且用户属于 plugdev 组。符号链接(默认)归 root:root 所有,但即使使用取消引用的 chown 将其设为 root:plugdev,也没有任何区别。