Ubuntu USB设备端口号绑定

Ubuntu USB设备端口号绑定

  • 1. 需求和来源
  • 2. 查看端口信息
  • 3. 规则配置
  • 4. 单端口情况
  • 5. 多端口情况
  • 6. 相同ID情况


1. 需求和来源

ROS机器人开发过程中,需要通过USB口连接多个设备,如:下层执行器,雷达等
而Linux是按照插入顺序对设备进行编号的,例如ttyUSB0, ttyUSB1或者 ttyACM0, ttyACM1等等
这样的话,每次重新开机的时候容易出现设备不对应编号的情况
这就无法在代码中固定设备的端口号
因此需要将设备的端口号固定


2. 查看端口信息

接下来以两块正点原子阿波罗开发板和一个RPLIDAR-A1激光雷达在 Ubuntu 16.04 环境下为例:

先不接设备,查看端口信息:

$ lsusb

Ubuntu USB设备端口号绑定_第1张图片
然后接上一块正点原子阿波罗开发板,再查看端口信息:

$ lsusb

Ubuntu USB设备端口号绑定_第2张图片
可以查看到新增加的正点原子阿波罗开发板设备端口

ID 1a86:7523 表示USB设备的ID
这个ID由芯片制造商设置,可以唯一表示该设备

  • 1a86 usb_device_descriptor.idVendor
  • 7523 usb_device_descriptor.idProduct

3. 规则配置

/etc/udev/rules.d/下创建任意名称的规则配置文件,如:usb.rules并进行编辑

$ cd /etc/udev/rules.d/
$ sudo touch usb.rules
$ sudo nano usb.rules 

在这里插入图片描述
编辑内容如下:

KERNEL=="ttyUSB*",ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="alientek_apollo"

内容中匹配sys中内核名为ttyUSB*的设备
依据生产商编号idVendor和产品号idProduct匹配属性
设定读写权限为0777
符号链接名为alientek_apollo

重新配置生效规则:

$ sudo /etc/init.d/udev restart

4. 单端口情况

现在,拔插设备,再查看映射结果:

$ ls -l /dev |grep ttyUSB

在这里插入图片描述
现在访问/dev/alientek_apollo就是访问该设备了

利用Python进行简单的测试:
Ubuntu USB设备端口号绑定_第3张图片


5. 多端口情况

现在先拔出正点原子阿波罗开发板,插入RPLIDAR-A1激光雷达,查看端口信息:

$ lsusb

Ubuntu USB设备端口号绑定_第4张图片
可以查看到新增加的RPLIDAR-A1激光雷达设备端口 ID 10c4:ea60
再查看端口:

$ ls /dev/ttyUSB*

在这里插入图片描述
现在的ttyUSB0为RPLIDAR-A1激光雷达设备端口,而不是刚刚拔出的正点原子阿波罗开发板
如果在相关的端口配置代码中以ttyUSB0为端口名称,那这样搞混设备就炸裂了

那么对规则/etc/udev/rules.d/usb.rules 再次配置,增加以下内容:

KERNEL=="ttyUSB*",ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"

重新配置生效规则:

$ sudo /etc/init.d/udev restart

现在,拔插设备,再查看映射结果:

$ ls -l /dev |grep ttyUSB

在这里插入图片描述
现在访问/dev/rplidar就是访问RPLIDAR-A1激光雷达设备了

利用Python进行简单的测试:
Ubuntu USB设备端口号绑定_第5张图片
接下来,利用Python同时配置这两个端口:
Ubuntu USB设备端口号绑定_第6张图片
可以看到,正点原子阿波罗开发板的设备端口应为连接而配置错误
那么现在插上刚刚的正点原子阿波罗开发板
再配置这两个端口:
在这里插入图片描述
这样的配置就避免了设备不对应编号的情况,且在代码中以ser0ser1区分两个设备


6. 相同ID情况

但需要注意的是:
现在的规则,只适用于某个设备插上之后,其ID是唯一的,与其他设备不同

那么在相同ID情况下,如两块正点原子阿波罗开发板
Ubuntu USB设备端口号绑定_第7张图片
这样的情况,以上的规则也无法避免设备不对应编号的情况

莫慌,查询端口号:

ls -l /sys/class/tty

在这里插入图片描述
注意到tyyUSB的前一位不相同,3-2:1.03-3.1:1.0
那么对规则/etc/udev/rules.d/usb.rules 再次配置:

KERNEL=="ttyUSB*", KERNELS=="3-2", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="alientek_apollo_0"
KERNEL=="ttyUSB*", KERNELS=="3-3.1", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="alientek_apollo_1"
KERNEL=="ttyUSB*",ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"

重新配置生效规则:

$ sudo /etc/init.d/udev restart

现在,拔插设备,再查看映射结果:

$ ls -l /dev |grep ttyUSB

在这里插入图片描述


谢谢!

你可能感兴趣的:(Linux)