树莓派设备端口号绑定

project做到最近,遇到了一个尴尬的问题:一台树莓派接了多个设备,例如多个arduino、串口转USB和无线键鼠等等。物理上USB不够,直接将一个USB hub就可以了。
不过这就出现了问题:Linux是按照插入顺序对设备进行编号的,例如ttyUSB0,ttyUSB1或者ttyACM0,ttyACM1等等,那么每次重新开机的时候容易出现设备不对应编号的情况,这就无法在代码中固定设备的端口号,因此我们必须想办法将设备的端口号固定。笔者总结了网上相关的资料,发现大家写的还是比较详细了,因此就简单地总结一下具体用法,原理就不再赘述了。

1. 将单台设备端口号固定

【适用情况】:
适用于某个设备插上之后,它的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即可访问该设备。

2. 多台相同ID的设备端口号固定

【适用情况】:
多台相同设备,例如多台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即可访问该设备。

3. 参考资料

[1]http://blog.csdn.net/qq_33662195/article/details/71185063
[2]http://blog.csdn.net/zuoxi4621/article/details/75173536

你可能感兴趣的:(嵌入式开发)