Raspberry Pi 上 ubuntu 中的静态绑定串口

Static binding serial ports in ubuntu on Raspberry Pi

我是 运行 4 个 ESP32 的设置,它们通过串行连接连接到 PI。有没有办法静态绑定所有的 ESP,这样每次启动后的端口顺序都无关紧要? 它也必须是不特定的 ID,因为我 运行 几个类似的设置,代码应该适合所有人。 另外,在替换的情况下,我只想让系统知道同一端口上有相同的设备。

对不起,如果我写得混乱,但一般来说,我希望 ESP 是可替换的,而端口描述了设备的功能。

谢谢大家,祝编码愉快

不幸的是,Raspberry Pi(一般不了解 linux)在每次启动后或 connecting/disconnecting 设备时重新分配 USB 端口。所以串口号或多或少是随机变化的。您需要一些其他方法来识别哪个设备是哪个。最好的方法可能是使用未使用的引脚来识别设备并在启动时从主机查询设备 ID,这样你就知道哪个 ESP32 连接在哪个端口上。

抱歉,唯一实用的方法是基于 ID。 USB 设备的创建顺序与它们初始化的顺序相同,因此没有任何保证。如果有帮助,这里有一个 udev 规则,它从 Silabs USB 串行芯片的序列号创建符号链接,例如/dev/EDK-d80d38b81e。使用 DevKitC 和 LOLIN32 开发板进行测试。

# udev rules for the Espressif ESP32-DevKitC and Wemos LOLIN32 dev boards to
# allocate symlinks with fixed names for each device using its serial number.

# CP2102N/CP2104N with idVendor=10c4, idProduct=ea60
#
# Instructions:
# 1. Copy udev rules and restart daemon:
#   $ sudo ln -s "$PWD/70-cp210xn_ESP32-DevKitC.rules" /etc/udev/rules.d/ && sudo systemctl restart udev
# 2. Disconnect and connect the board to USB

# Espressif ESP32-DevKitC with CP2102N.
# Sample serial in chip is "7063b99e4b74ea11b6f52208cf25bb41" where only first
# 10 chars seem to be unique. We cut the serial down to those and create a
# symlink from the result, e.g. "/dev/EDK-7063b99e4b"
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{manufacturer}=="Silicon Labs", ATTRS{product}=="CP2102N USB to UART Bridge Controller",  PROGRAM="/usr/bin/awk -- 'BEGIN { print substr(\"$attr{serial}\",1,10) }'" SYMLINK+="EDK-%c", GROUP="dialout", MODE="0660"

# Wemos LOLIN32 with CP2104N, sample serial in chip is "01DFA32C".
# We create a symlink "EDK-01DFA32C" (cropping to first 10 chars just in case).
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{manufacturer}=="Silicon Labs", ATTRS{product}=="CP2104 USB to UART Bridge Controller",  PROGRAM="/usr/bin/awk -- 'BEGIN { print substr(\"$attr{serial}\",1,10) }'" SYMLINK+="EDK-%c", GROUP="dialout", MODE="0660"

我有一个类似的问题,我需要将物理 USB 端口静态绑定到设备,在我的例子中,它们是便宜的 serial/USB 转换器并且它们没有唯一的 ID,所以唯一的方法是识别他们正在使用物理端口映射。 我解决了使用别名创建 udev 规则的问题,如下所示:

SUBSYSTEM=="tty",KERNELS=="2-2:1.0",SYMLINK+="device1"
SUBSYSTEM=="tty",KERNELS=="2-3:1.0",SYMLINK+="device2"

现在我使用符号链接打开与设备的连接。这样只要不交换连接器,每个设备将始终具有相同的符号链接。