本文参考引用博客https://blog.csdn.net/lby0910/article/details/77586728
在做树莓派相关的工程时,由于Linux是按照插入顺序对设备进行编号,常遇到插拔不同USB设备(如串口、摄像头、传感器等外设)树莓派识别端口号跳跃的问题,例如原本识别为/dev/video0,重插后识别为/dev/video2这种尴尬的问题。这使得在程序中固定端口号读取十分不方便。幸运的是,我们可以通过使用USB设备的唯一识别码固定端口号。下面分别对串口设备和USB摄像头设备的绑定方法做简介(假设插拔设备后其ID唯一):
查询ID
lsusb
结果如下
Bus 001 Device 001: ID 0909:0824 Audio-Technica Corp
Bus 001 Device 002: ID 1a40:0101 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 003: ID 0924:1b25 Cubeternet
通过多次插拔观察设备增减可以确认出设备信息和设备的对应关系。以上Device001/002/003分别是摄像头0、串口蓝牙、摄像头1。接下来我们尝试使用其32位ID号固定其端口。
修改文件
sudo vim /etc/udev/rules.d/99-com.rules
打开文件后在最后一行添加
KERNEL=="ttyUSB*",ATTRS{idVendor}=="1a40",ATTRS{idProduct}=="0101", MODE:=“0777”, SYMLINK+="device0"
KERNEL=="video*",ATTRS{idVendor}=="0909",ATTRS{idProduct}=="0824", MODE:=“0777”, SYMLINK+="video0"
KERNEL=="video*",ATTRS{idVendor}=="0924",ATTRS{idProduct}=="1b25", MODE:=“0777”, SYMLINK+="video1"
如果绑定的是串口设备,则KERNEL项写“ttyUSB*”,如果是摄像头设备则写“video*”,将32位ID按顺序写入后两项中,将预绑定的设备名称写入SYMLINK项中
重启重插
// 重启指令
sudo /etc/init.d/udev restart
重启后,再次查看当前连接的摄像头设备和串口设备,可以看到新名称,无论之后如何插拔,只要识别到相同的设备ID,linux都会将其命名为刚刚设置的名称。
ls /dev/device*
device0
ls /dev/video*
/dev/video0 /dev/video1
使用/dev/device0, /dev/video0, /dev/video1即可访问相应设备。