当两个及以上同型号的USB设备(并且他们的Vendor ID和Product ID都一样)连接至电脑时,Ubuntu系统会默认把他们都挂载在同一个端口ttyUSB0上,此时导致先连接至电脑的USB设备可以进行正常的串口通信,其他USB设备不能进行数据的收发。
通过lsusb
命令查看已连接至电脑的两个USB设备,如下会发现除了设备序号不同,其他都相同
为解决上诉问题,我们可以创建一个udev规则文件,把它放在Ubuntu的/etc/udev/rules.d/目录下,
如下是我创建的一个myUSB.rules里的内容:
KERNEL=="ttyUSB*",ATTRS{devpath}=="2",ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523",MODE:="0777",SYMLINK+="master"
KERNEL=="ttyUSB*",ATTRS{devpath}=="3",ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523",MODE:="0777",SYMLINK+="slave"
KERNEL=="ttyUSB*"表示只对ttyUSB*设备进行匹配,ATTRS{idVendor}和ATTRS{idProduct}分别指定设备的Vendor ID和Product ID;SYMLINK使用+=,是设备的链接或叫别名
其中最重要的一条信息:devpath!不同USB设备对应的devpath不同,故可以用来区分端口。
我们可以通过每次只连接一个USB设备,然后在终端输入udevadm info --attribute-walk /sys/class/tty/ttyUSB0 | grep devpath
去查阅USB设备的devpath信息。如下为两个同型号USB设备的devpath信息:
最后重载udev规则,使其生效:sudo udevadm control --reload-rules
重新插入设备,使用命令ls -l /dev | grep ttyUSB
查看如下,可以发现两个同型号的USB设备分别挂载在ttyUSB0和ttyUSB1端口上,此时两个设备都可以进行正常的串口通信。