在 Ubuntu 22.04 中,无法强制固定 /dev/ttyUSB0、/dev/ttyUSB1 这类动态编号(内核按插入顺序分配),但可以通过 udev 规则 为设备创建固定符号链接(如 /dev/ttyUSB_FIXED),实现 “固定访问路径” 的效果。
一、两种固定方案
方案 1:按设备唯一 ID 绑定(设备换端口仍有效)
用 idVendor(厂商 ID)+ idProduct(产品 ID)+ serial(序列号) 唯一识别设备,适合同型号多设备场景。
方案 2:按物理 USB 端口绑定(端口固定,换设备仍有效,本文介绍这种方式)
用 KERNELS(硬件端口路径) 绑定,适合 “固定端口插固定设备” 的场景
二、USB端口规划
根据板子的USB接口布局,规划分配USB端口功能如下表:
三、操作步骤:方案2按物理端口绑定(换设备不换端口)
1. 获取端口路径(KERNELS)
udevadm info -a -n /dev/ttyUSB0 | grep KERNELS
示例输出:KERNELS=="1-2.3"(代表 USB 物理端口)
2. 编写端口绑定规则
绑定规则文件内容示例如下所示:
sudo vim /etc/udev/rules.d/99-usb-port-fixed.rules
也可以直接Copy下方的配置文件作为模版,在同一规则文件中添加多条规则,为每个设备 / 端口分配不同固定名:
# ==============================================# ROS 机器人 4路 USB 固定端口规则# 永久固定,插拔/重启/换设备都不变# ==============================================# 端口 1-1 固定名 IMU0SUBSYSTEM=="tty", KERNEL=="ttyUSB*|ttyACM*", KERNELS=="1-1", MODE:="0666", GROUP:="dialout", SYMLINK+="ttyUSB_IMU0"# 端口 5-1.1 固定名 GPS_GPSD_CHRONYSUBSYSTEM=="tty", KERNEL=="ttyUSB*|ttyACM*", KERNELS=="5-1.1", MODE:="0666", GROUP:="dialout", SYMLINK+="ttyUSB_GPS_GPSD_CHRONY"# 端口 5-1.2 固定名 GPS_ROSSUBSYSTEM=="tty", KERNEL=="ttyUSB*|ttyACM*", KERNELS=="5-1.2", MODE:="0666", GROUP:="dialout", SYMLINK+="ttyUSB_GPS_ROS"# 端口 4-1 固定名 OTHERSUBSYSTEM=="tty", KERNEL=="ttyUSB*|ttyACM*", KERNELS=="4-1", MODE:="0666", GROUP:="dialout", SYMLINK+="ttyUSB_OTHER"
sudo udevadm control --reload-rulessudo udevadm triggersudo usermod -aG dialout $USER
四、常见问题
规则不生效:检查 ID / 序列号是否正确、文件后缀为 .rules、重载命令执行完整。
权限不足:确保加入 dialout 组:sudo usermod -aG dialout $USER,重新登录生效。
1. 修改 gpsd 配置文件,指定新映射的端口,修改完成之后,记得重启一下服务,命令如下:sudo systemctl restart gpsd