设备每次插入Linux识别的串口不一样?试试udev!

udev规则

1、不插入设备执行确定硬件属性

bash 复制代码
ls /dev/tty*

2、插入设备执行确定端口

bash 复制代码
ls /dev/tty*

3、查属性记录设备的idVendor、idProduct、serial(或 manufacturer/product)

bash 复制代码
# 尽量使用 serial 来区分同型号设备;如果两设备型号不同,idVendor + idProduct 就够
udevadm info -a -n /dev/ttyACM0 | head -n 100
或
udevadm info -a -n /dev/ttyACM0 | grep -E 'ATTRS{serial}|ATTRS{product}|ATTRS{manufacturer}|ATTRS{idProduct}|bInterfaceNumber'

4、编写udev规则

把 vvvv/pppp/serial 替换成上一步查到的值 如果两者是同品牌同型号但序列号不同,使用 serial 区分;如果序列号缺失,可以用 ATTRS{product}/ATTRS{manufacturer} 或 KERNELS=="1-2.3:1.0" 这样的端口路径(依赖 hub 拓扑,不如序列号稳)

rules 复制代码
# IMU
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", ATTRS{serial}=="5B0B029760", SYMLINK+="ttyIMU"
# Battery
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d3", ATTRS{serial}=="5A31010829", SYMLINK+="ttyBattery"
# Camera
SUBSYSTEM=="video4linux", ATTR{index}=="0", ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:1:1.0", SYMLINK+="Camera-left"
SUBSYSTEM=="video4linux", ATTR{index}=="0", ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:2:1.0", SYMLINK+="Camera-right"

5、添加规则

bash 复制代码
sudo nano /etc/udev/rules.d/99-custom-tty.rules

6、 重载并应用

bash 复制代码
sudo udevadm control --reload
sudo udevadm trigger --subsystem-match=tty

7、验证:重新插拔或用

bash 复制代码
sudo udevadm trigger

检查是否指向对应 ttyACM*

bash 复制代码
ls -l /dev/ttyIMU /dev/ttyBattery

Camera

1、先看看系统已有的唯一名

bash 复制代码
ls -l /dev/v4l/by-id

2、查端口路径

bash 复制代码
# 同一个型号
ls -l /dev/v4l/by-path
或
# 不同型号或不同厂商
udevadm info --name=/dev/video3 | grep -E 'ID_SERIAL|ID_SERIAL_SHORT|ID_PATH|ID_V4L_PRODUCT|idVendor|idProduct|serial'

例如结果为

bash 复制代码
~ → ls -l /dev/v4l/by-path
总计 0
lrwxrwxrwx 1 root root 12 Dec 11 20:58 pci-0000:00:14.0-usb-0:1:1.0-video-index0 -> ../../video0
lrwxrwxrwx 1 root root 12 Dec 11 20:58 pci-0000:00:14.0-usb-0:1:1.0-video-index1 -> ../../video1
lrwxrwxrwx 1 root root 12 Dec 11 20:58 pci-0000:00:14.0-usb-0:2:1.0-video-index0 -> ../../video2
lrwxrwxrwx 1 root root 12 Dec 11 20:58 pci-0000:00:14.0-usb-0:2:1.0-video-index1 -> ../../video3
lrwxrwxrwx 1 root root 12 Dec 11 20:58 pci-0000:00:14.0-usbv3-0:1:1.0-video-index0 -> ../../video0
lrwxrwxrwx 1 root root 12 Dec 11 20:58 pci-0000:00:14.0-usbv3-0:1:1.0-video-index1 -> ../../video1
lrwxrwxrwx 1 root root 12 Dec 11 20:58 pci-0000:00:14.0-usbv3-0:2:1.0-video-index0 -> ../../video2
lrwxrwxrwx 1 root root 12 Dec 11 20:58 pci-0000:00:14.0-usbv3-0:2:1.0-video-index1 -> ../../video3

则udev规则为

rules 复制代码
# Camera
SUBSYSTEM=="video4linux", ATTR{index}=="0", ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:1:1.0", SYMLINK+="Camera-left"
SUBSYSTEM=="video4linux", ATTR{index}=="0", ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:2:1.0", SYMLINK+="Camera-right"

执行上述第5步,验证

bash 复制代码
ls -l /dev/Camera-left /dev/Camera-right
相关推荐
小北方城市网10 小时前
Spring Boot 接口开发实战:RESTful 规范、参数校验与全局异常处理
java·jvm·数据库·spring boot·后端·python·mysql
千寻技术帮10 小时前
10399_基于SpringBoot的智慧养老院管理系统
java·spring boot·后端·源码·安装·代码
飞升不如收破烂~10 小时前
# Spring Boot 跨域请求未到达后端问题排查记录
java·spring boot·后端
短剑重铸之日10 小时前
《RocketMQ研读》面试篇
java·后端·面试·职场和发展·rocketmq
changzehai11 小时前
Rust + VSCode + probe-rs搭建stm32-rs嵌入式开发调试环境
vscode·后端·stm32·rust·嵌入式·probe-rs
终端域名11 小时前
如何选择有利于品牌宣传的网站域名
java·后端·struts·数字货币域名·网站域名
拽着尾巴的鱼儿11 小时前
Spring:定时任务@Scheduled cron 的实现原理
java·后端·spring
郑州光合科技余经理11 小时前
源码部署同城O2O系统:中台架构开发指南
java·开发语言·后端·架构·系统架构·uni-app·php
Marktowin11 小时前
访问控制权限模型分析梳理
后端
Object~11 小时前
7.Go语言中的slice
开发语言·后端·golang