以 USB 转串口的设备通常节点名为ttyUSBx(x为0~n),Linux 内核会根据设备插入的顺序进行分配。如果仅仅以设备节点ttyUSBx来区别是哪个设备,以为串口号是随时会发生改变的,没办法保证设备 A 就是 ttyUSB0,设备 B 就是 ttyUSB1。

我在使用 Rosmaster 驱动小车电机时,出现了串口不稳定的状况,不便于开发。所以我寻找了一个解决方案将 USB 串口名称映射为一个固定值。

udev 是 Linux kernel 的设备管理器,主要管理/dev目录下的设备节点。遂可以通过自定义 udev 规则为串口设备创建固定的符号链接,例如将需要的电机串口固定为dev/ttyMotor

通过udevadm获取设备路径

1
2
udevadm info --query=path --name=/dev/ttyUSB0
# 输出示例:/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0/tty/ttyUSB0

记录下设备路径1-1.3:1.0

  1. 创建自定义 udev 设备管理文件

    1
    sudo nano /etc/udev/rules.d/99-rosmaster-serial.rules
  2. 基于前面的设备路径,定义 udev 规则

    1
    SUBSYSTEM=="tty", KERNELS=="1-1.3:1.0", SYMLINK+="ttyMotor" 

    需要将KERNELS替换为前面的设备路径,作为设备的唯一标识符。

  3. 重载规则并测试是否可用

    1
    2
    3
    4
    5
    sudo udevadm control --reload-rules  # 重新加载规则
    sudo udevadm trigger # 触发设备重新识别

    # 验证符号链接是否创建成功
    ls -l /dev/ttyMotor # 应指向实际设备(如ttyUSB0)

这样就可以通过固定的串口名称ttyMotor映射到电机串口进行开发了。