Ubuntu USB设备端口号绑定
- 1. 需求和来源
- 2. 查看端口信息
- 3. 规则配置
- 4. 单端口情况
- 5. 多端口情况
- 6. 相同ID情况
1. 需求和来源
ROS机器人开发过程中,需要通过USB口连接多个设备,如:下层执行器,雷达等
而Linux是按照插入顺序对设备进行编号的,例如ttyUSB0, ttyUSB1或者 ttyACM0, ttyACM1等等
这样的话,每次重新开机的时候容易出现设备不对应编号的情况
这就无法在代码中固定设备的端口号
因此需要将设备的端口号固定
2. 查看端口信息
接下来以两块正点原子阿波罗开发板和一个RPLIDAR-A1激光雷达在 Ubuntu 16.04 环境下为例:
先不接设备,查看端口信息:
$ lsusb

然后接上一块正点原子阿波罗开发板,再查看端口信息:
$ lsusb

可以查看到新增加的正点原子阿波罗开发板设备端口
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进行简单的测试:

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

可以查看到新增加的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进行简单的测试:

接下来,利用Python同时配置这两个端口:

可以看到,正点原子阿波罗开发板的设备端口应为连接而配置错误
那么现在插上刚刚的正点原子阿波罗开发板
再配置这两个端口:

这样的配置就避免了设备不对应编号的情况,且在代码中以ser0,ser1区分两个设备
6. 相同ID情况
但需要注意的是:
现在的规则,只适用于某个设备插上之后,其ID是唯一的,与其他设备不同
那么在相同ID情况下,如两块正点原子阿波罗开发板

这样的情况,以上的规则也无法避免设备不对应编号的情况
莫慌,查询端口号:
ls -l /sys/class/tty

注意到tyyUSB的前一位不相同,3-2:1.0 与 3-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

谢谢!
最后
以上就是现代柠檬最近收集整理的关于Ubuntu USB设备端口号绑定1. 需求和来源2. 查看端口信息3. 规则配置4. 单端口情况5. 多端口情况6. 相同ID情况的全部内容,更多相关Ubuntu内容请搜索靠谱客的其他文章。
发表评论 取消回复