前言
在ubuntu中,有时使用多个usb设备时,出现usb端口号混乱;
- 比如:a设备本来对应 /dev/ttyusb0,b设备对应 /dev/ttyusb1;
- 发现重启系统后,a设备本来对应 /dev/ttyusb1,b设备对应 /dev/ttyusb0,两个设备的分配的端口号不固定的情况。
linux是按照插入顺序对设备进行编号的;这种不稳定因素,使得编写驱动时麻烦,于是本文参考了linux社区和博客文章的方法,绑定各个usb设备的端口号。
一、不同串口设备绑定
1.1、查看usb设备端口信息
将串口设备插入usb口,通过lsusb查看端口信息。例如:
接入了两个新的usb设备,如下图红色框中的信息;一个是ft232(id是0403:6001)、一个是hl-340(id是1a86:7523);

id 0403:6001 表示usb设备的id(这个id由芯片制造商设置,可以唯一表示该设备)
0403 usb_device_descriptor.idvendor 6001 usb_device_descriptor.idproduct
1.2、创建配置文件
在/etc/udev/rules.d/下创建任意名称的规则配置文件,如:usb.rules。
命令如下:
sudo vi /etc/udev/rules.d/usb.rules
编辑信息:
kernel=="ttyusb*", attrs{idvendor}=="0403", attrs{idproduct}=="6001", mode:="0777", symlink+="gnss"
kernel=="ttyusb*", attrs{idvendor}=="1a86", attrs{idproduct}=="7523", mode:="0777", symlink+="ultrasound_serial"匹配sys中内核名为ttyusb*的设备,属性匹配依据生产商编号idvendor和产品号idproduct, 设定读写权限为0777,;
符号链接名为gnss 对应ft232 usb, ultrasound_serial 对应 hl-340串口usb。
1.3、查看绑定情况
idvendor和idproduct由 lsusb -vvv 命令查看
sudo udevadm control --reload-rules sudo udevadm trigger
重新拔插两个串口设备
ls -l /dev |grep ttyusb

/dev/ultrasound_serial 指向/dev/ttyusb1;在程序里打开/dev/ultrasound_serial 就可以一直准确的打开指定的串口设备了;可以使用了。
1.4、使用绑定后的usb设备
例如使用ultrasound_serial 设备;打开串口,python代码:
u_serial = serial.serial('/dev/ultrasound_serial', 9600) 直接使用/dev/ultrasound_serial ,相当于使用/dev/ttyusb1
二、相同串口设备绑定
如果购买了两个相同的串口设备,比如都是ch341(id是1a86:7523),用上面的方法就无法区分和绑定了。
我们可以通过“kernels”的差异来绑定。
2.1 查询“kernels”
udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyusb0
看到如下信息:(ttyusb0 的“kernels”)

然后查询另一个usb设备,比如他的端口是ttyusb2, ttyusb2的“kernels”(我这里有三个串口,需要区分ttyusb0、ttyusb2 他两是都是ch341)
udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyusb2

能看到 ttyusb0 的“kernels”=="1-1:1.0"、 ttyusb2 的“kernels”=="1-2:1.0" 它两是有区别的。
2.2、创建配置文件
在/etc/udev/rules.d/下创建任意名称的规则配置文件,如:usb.rules。
命令如下:
sudo vi /etc/udev/rules.d/usb.rules
编辑信息:
kernel=="ttyusb*", kernels=="1-1:1.0", mode:="0777", symlink+="ultrasound_serial1" kernel=="ttyusb*", kernels=="1-2:1.0", mode:="0777", symlink+="ultrasound_serial2"
匹配sys中内核名为ttyusb*的设备,根据kernels的号的不同进行绑定, 设定读写权限为0777,;
符号链接名为ultrasound_serial1 对应ttyusb0, ultrasound_serial2 对应ttyusb2。
1.3、查看绑定情况
idvendor和idproduct由 lsusb -vvv 命令查看
sudo udevadm control --reload-rules sudo udevadm trigger
重新拔插两个串口设备
ls -l /dev |grep ttyusb
/dev/ultrasound_serial1 指向/dev/ttyusb0;在程序里打开/dev/ultrasound_serial1 就可以一直准确的打开指定的串口设备了;可以使用了。
1.4、使用绑定后的usb设备
例如使用ultrasound_serial 设备;打开串口,python代码:
u_serial = serial.serial('/dev/ultrasound_serial1', 9600) 直接使用/dev/ultrasound_serial1 ,相当于使用/dev/ttyusb0
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论