ubuntu 绑定串口设备
背景
制作 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 规则创建固定别名,可以直接在程序中指定设备通信串口,避免串口混乱。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)