如何在Ubuntu下为Python pyserial使用的USB串口设备设置持久命名?
为USB转RS485串口设置持久命名的方法
在Ubuntu 22.04上解决串口随机匹配的问题,最可靠的方式是通过udev规则给设备绑定固定别名,也可以在代码层面直接过滤设备属性,两种方案如下:
方案一:通过udev规则创建持久软链接
这是系统层面的解决方案,能让设备始终映射到固定名称,不管系统分配的ttyUSBx编号怎么变。
获取设备的唯一标识信息
- 先执行
lsusb命令,找到你的USB转RS485适配器条目,比如:
这里的Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter1a86是厂商ID(idVendor),7523是产品ID(idProduct)。 - 如果两个适配器是同型号的(厂商ID和产品ID相同),还需要获取各自的序列号。执行
udevadm info --name=/dev/ttyUSB0 --attribute-walk,找到ATTRS{serial}字段的唯一值,每个设备的序列号都是独有的。
- 先执行
创建udev规则文件
- 在
/etc/udev/rules.d/目录下新建规则文件,比如99-usb-serial.rules(文件名开头的数字越大,规则优先级越高)。 - 编辑文件,根据设备信息添加规则:
- 同型号设备(靠序列号区分):
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="ABC123", SYMLINK+="ttyRS485_1" SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="DEF456", SYMLINK+="ttyRS485_2" - 不同型号设备(靠厂商+产品ID区分):
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyRS485_1" SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="ttyRS485_2"
SYMLINK+后面的名称可以自定义,比如ttyRS485_1、ttyRS485_2,这就是后续要使用的固定端口名。 - 同型号设备(靠序列号区分):
- 在
生效规则
执行以下命令重新加载并触发udev规则:sudo udevadm control --reload-rules sudo udevadm trigger之后你就能在
/dev/目录下看到自定义的软链接,直接用这个名称访问串口即可。
方案二:在Python代码中过滤设备属性
如果不想修改系统配置,也可以在代码里通过设备的唯一属性(比如序列号、厂商信息)精准匹配目标端口:
import serial.tools.list_ports def get_target_port(target_serial): all_ports = serial.tools.list_ports.comports() for port in all_ports: # 匹配目标序列号,找到对应的设备节点 if port.serial_number == target_serial: return port.device return None # 使用示例:传入两个设备的序列号 port1 = get_target_port("ABC123") port2 = get_target_port("DEF456")
这样每次运行代码都会根据序列号找到正确的串口,避免随机匹配问题。
内容的提问来源于stack exchange,提问作者NicoCaldo
相关产品推荐
相关产品推荐

