您的位置:首页 > 其它

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

2017-11-08 09:44 120 查看


吃水不忘挖井人:参考链接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


那么有了这个物理端口,接下来应该怎么玩呢?写脚本绑定,脚本举例如下所示:

[cpp]
view plain
copy

#!/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

重新插拔设备 观察现象  应当是大功告成,如有问题请留言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: