树莓派学习笔记三:设备端口绑定

吃水不忘挖井人:参考链接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 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/ieeso/article/details/83986639
今日推荐