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

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

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

  1. #!/bin/bash  
  2. echo  'KERNELS=="3-1.1",  MODE:="0666", GROUP:="dialout",  SYMLINK+="serial_0"' >/etc/udev/rules.d/seriel_0.rules  
  3.   
  4. echo  'KERNEL=="ttyACM*", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0042", MODE:="0666", GROUP:="dialout",  SYMLINK+="dashgo"' >/etc/udev/rules.d/dashgo.rules  
  5.   
  6. echo  'KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", GROUP:="dialout",  SYMLINK+="dashgo"' >/etc/udev/rules.d/ch34x.rules  
  7.   
  8. service udev reload  
  9. sleep 2  
  10. service udev restart  

如上第一行所示,KERNELS就是你要做重命名的物理端口号,MODE:="0666"的意思是这个端口的设备具有读写权限,这样就不用脑残地每次都敲一遍chmod **  666了,GROUP为用户组,SYMLINK+=的意思是在系统默认的设备名的基础上再添加一个设备名叫serial_0这个可以你自己指定,以后插在这个物理端的设备都会多一个这个名字,这样以后操作这个固定的设备名就可以了。其他几行的原理类似,其他几行都是通过idVendor idProduct 的值来确定设备的设备号,这样有一个问题就是如果碰到两个设备使用一模一样的串口芯片,那么这两个设备的idVendor和idProduct的值是一样的,也就是说通过这种方式是无法区分两个设备的(笔者在机器人产品开发的过程中就碰到了)。

根据自己的情况完成脚本

然后:

sudo sh ./脚本名.sh

重新插拔设备 观察现象  应当是大功告成,如有问题请留言

猜你喜欢

转载自blog.csdn.net/lovedarling/article/details/78475138