背景

制作 ROS 小车,树莓派和 stm32 开发板,及激光雷达串口连接通信。stm32 开发板使用 CH340 串口芯片,装过驱动后设备显示为 /dev/ttyCH341USB0。激光雷达显示为 /dev/ttyUSB0。本来相安无事,直到有一天,CH340芯片串口恢复显示为 /dev/ttyUSB*,与激光雷达会根据插入的先后,分配ttyUSB0,和ttyUSB1。需要为设备绑定串口别名。

硬件

  •  stm32 开发板 串口转usb 芯片为 CH340
  •  激光雷达串口芯片 CP210x 
  •  树莓派4b ubuntu 22.04

实现

需要使用使用 udev 规则创建固定别名

一. 查询 USB 设备 ID

输入 lsusb 可以看到设备的 ID 如下。

xxx:~$ lsusb

Bus 001 Device 004: ID 10c4:ea60 Silicon Labs CP210x UART Bridge
Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics CH340 serial converter

 ID 格式为 (供应商ID idVendor):(设备ID idProduct) ,如第一行10c4为供应商ID, ea60为设备ID。

 或者输入udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep -E "idVendor|idProduct|serial",serial 为序列号,涉及多个同款设备时可以区分。这里含多个 idProduct 和 idVendor 是显示了从设备本身到根节点的所有层级。我们只看第一层级。

:~$ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep -E "idVendor|idProduct|serial"
    SUBSYSTEMS=="usb-serial"
    ATTRS{idProduct}=="ea60"
    ATTRS{idVendor}=="10c4"
    ATTRS{serial}=="0001"
    ATTRS{idProduct}=="3431"
    ATTRS{idVendor}=="2109"
    ATTRS{idProduct}=="0002"
    ATTRS{idVendor}=="1d6b"
    ATTRS{serial}=="0000:01:00.0"
:~$ udevadm info --name=/dev/ttyUSB1 --attribute-walk | grep -E "idVendor|idProduct|serial"
    SUBSYSTEMS=="usb-serial"
    ATTRS{idProduct}=="7523"
    ATTRS{idVendor}=="1a86"
    ATTRS{idProduct}=="3431"
    ATTRS{idVendor}=="2109"
    ATTRS{idProduct}=="0002"
    ATTRS{idVendor}=="1d6b"
    ATTRS{serial}=="0000:01:00.0"

 

二. 创建 udev 规则

新建文件

sudo nano /etc/udev/rules.d/99-usb-serial.rules

将上面查到的 ID 号写入规则文件,指定别名 stm32 和 lidar,MODE=0666 意味着所有用户(包括普通用户)都有读写权限。

# STM32设备规则 (CH340芯片)
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="stm32", MODE="0666"

# 激光雷达设备规则 (Silicon Labs CP210x)
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="lidar", MODE="0666"

加载更新 udev 规则 

sudo udevadm control --reload-rules
sudo udevadm trigger

插拔设备后,可看到 /dev/ 下已经有了我们规定的设备别名。验证输入ls -l 后可看到别名已经指定成功。在程序中可以直接使用串口别名。如在激光雷达的 launch 文件中可直接传入参数 {"serial_port": "/dev/lidar"}

$ ls -l /dev/lidar /dev/stm32
lrwxrwxrwx 1 root root 7 Jun  1 16:53 /dev/lidar -> ttyUSB1
lrwxrwxrwx 1 root root 7 Jun  1 16:53 /dev/stm32 -> ttyUSB0

结论

通过使用 udev 规则创建固定别名,可以直接在程序中指定设备通信串口,避免串口混乱。

 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐