project做到最近,遇到了一个尴尬的问题:一台树莓派接了多个设备,例如多个arduino、串口转USB和无线键鼠等等。物理上USB不够,直接将一个USB hub就可以了。
不过这就出现了问题:Linux是按照插入顺序对设备进行编号的,例如ttyUSB0,ttyUSB1或者ttyACM0,ttyACM1等等,那么每次重新开机的时候容易出现设备不对应编号的情况,这就无法在代码中固定设备的端口号,因此我们必须想办法将设备的端口号固定。笔者总结了网上相关的资料,发现大家写的还是比较详细了,因此就简单地总结一下具体用法,原理就不再赘述了。
【适用情况】:
适用于某个设备插上之后,它的ID是唯一的,与其他设备不同。
【查询ID】:
lsusb
应该会看到若干USB设备的信息:
Bus 001 Device 010: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 005: ID 0bda:5411 Realtek Semiconductor Corp.
Bus 001 Device 008: ID 24ae:1100
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
以Device010为例:其ID是:10c4:ea60
【修改文件】:
sudo nano /etc/udev/rules.d/99-com.rules
在后面添加:
KERNEL=="ttyUSB*",ATTRS{idVendor}=="10c4",ATTRS{idProduct}=="ea60", MODE:=“0777”, SYMLINK+="device0"
其中device0是我们将其重命名的设备,之后我们直接访问device0即可。换句话说,之后开机无论ID为10c4:ea60的设备被分配为ttyUSB0或者ttyUSB1,始终都可以通过device0来访问它。
【重启插拔】:
文件最后一行添加之后,执行:
sudo /etc/init.d/udev restart
并且插拔USB设备
【再次访问】:
再次访问:
ls -l /dev |grep ttyUSB
就能看到重定向的信息啦,我们之后在代码里直接访问/dev/device0即可访问该设备。
【适用情况】:
多台相同设备,例如多台arduino,它们被分配为ttyACM0和ttyACM1,通过第一个方法我们发现它们的ID都一样。
【查询】:
ls -l /sys/class/tty
这时应该会打印出来例如:
ttyACM0'/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.1/1-2.1:1.0/':
ttyACM1'/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.2/1-2.2:1.0':
我们发现最后的一位1-2.1和1-2.2是有区别的
【修改文件】:
sudo nano /etc/udev/rules.d/99-com.rules
在后面添加:
KERNEL=="ttyACM*",KERNELS=="1-2.1",MODE:=“0777”, SYMLINK+="device1"
KERNEL=="ttyACM*",KERNELS=="1-2.1",MODE:=“0777”, SYMLINK+="device2"
其中device1和device2是我们将两个arduino重命名的设备,道理同上。
【重启插拔】:
文件最后一行添加之后,执行:
sudo /etc/init.d/udev restart
并且插拔USB设备
【再次访问】:
再次访问:
ls -l /dev |grep ttyACM
就能看到重定向的信息啦,我们之后在代码里直接访问/dev/device1和/dev/device2即可访问该设备。
[1]http://blog.csdn.net/qq_33662195/article/details/71185063
[2]http://blog.csdn.net/zuoxi4621/article/details/75173536