吃水不忘挖井人:参考链接http://blog.csdn.net/kangear/article/details/46302741
我们在树莓派上玩ROS的时候通常会插入不同的USB设备,这些设备有USB通信的如Kinect,也有USB串口设备(如激光雷达,树莓派与底盘接口等)以USB转串口为例,通常设备节点名为ttyUSBx(x为0~n),Linux内核会根据插入设备的先后顺序进行编号的分配,比如第一个插入的设备编号为0,然后依此加1。那么问题来了,如果仅仅以设备节点ttyUSBn来区别具体是哪个设备,因为末位的编号是随时会变的,所以就会造成混乱。无法保证A设备就是0,B设备就是1。目前的内核早已经解决类似的问题,将所以有USB设备都导致到sys文件系统中,其实每个USB端口都有唯一的端口号,相当于每个门店的门牌号。只要我们依据端口号来进行设备的区分,那么问题就迎刃而解了。
比如当前设备插入两个USB转串口设备后,查看ttyUSBn所在端口的端口号:
root@android:/ $ ls -l /sys/class/tty/
...
lrwxrwxrwx root root 2011-01-01 13:40 ttyUSB0 -> ../../devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0
lrwxrwxrwx root root 2011-01-01 13:43 ttyUSB1 -> ../../devices/ff540000.usb/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1
root@android:/ $
1
2
3
4
5
1
2
3
4
5
其中ttyUSB0所在的端口号为3-1.1,而ttyUSB1所在的端口号为3-1.2。
那么有了这个物理端口,接下来应该怎么玩呢?写脚本绑定,脚本举例如下所示:
#!/bin/bash
echo 'KERNELS=="3-1.1", MODE:="0666", GROUP:="dialout", SYMLINK+="serial_0"' >/etc/udev/rules.d/seriel_0.rules
echo 'KERNEL=="ttyACM*", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0042", MODE:="0666", GROUP:="dialout", SYMLINK+="dashgo"' >/etc/udev/rules.d/dashgo.rules
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", GROUP:="dialout", SYMLINK+="dashgo"' >/etc/udev/rules.d/ch34x.rules
service udev reload
sleep 2
service udev restart
如上第一行所示,KERNELS就是你要做重命名的物理端口号,MODE:="0666"的意思是这个端口的设备具有读写权限,这样就不用脑残地每次都敲一遍chmod ** 666了,GROUP为用户组,SYMLINK+=的意思是在系统默认的设备名的基础上再添加一个设备名叫serial_0这个可以你自己指定,以后插在这个物理端的设备都会多一个这个名字,这样以后操作这个固定的设备名就可以了。其他几行的原理类似,其他几行都是通过idVendor idProduct 的值来确定设备的设备号,这样有一个问题就是如果碰到两个设备使用一模一样的串口芯片,那么这两个设备的idVendor和idProduct的值是一样的,也就是说通过这种方式是无法区分两个设备的(笔者在机器人产品开发的过程中就碰到了)。
根据自己的情况完成脚本
然后:
sudo sh ./脚本名.sh
重新插拔设备 观察现象 应当是大功告成,如有问题请留言
---------------------
作者:DPRobot
来源:CSDN
原文:https://blog.csdn.net/qq_33662195/article/details/71185063
版权声明:本文为博主原创文章,转载请附上博文链接!