这两天在ubuntu中开发跟串口有关程序时,发现来回拔插串口线或者插多个串口线时总是出现串口号ttyUSB*不固定的问题,给应用程序带来不少麻烦,遂找答案解决。
linux中设备号一般按先后顺序一次向后增大,udev规则文件可以解决这个问题。udev是一种Linux2.6内核采用的/dev 目录的管理系统(可以把它认为是windows中的设备管理器),它通过从sysfs获得的信息,可以提供对特定设备的固定的设备名。sysfs是linux 2.6内核的一种新型文件系统,它提供了当前设备的基本信息。
udev的重要功能就是为为设备提供固定的设备名,根据Wirting udev rules的详细介绍,udev有如下功能:
Rename a device node from the default name to something else
Provide an alternative/persistent name for a device node by creating a symbolic link to the default device node
Name a device node based on the output of a program
Change permissions and ownership of a device node
Launch a script when a device node is created or deleted (typically when a device is attached or unplugged)
Rename network interfaces
简单阅读之后创建文件/etc/udev/rules.d/10-local.rule, 内容如下
KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0777", SYMLINK+="user_uart"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="mcu_uart"
意思就是匹配sys中内核名为ttyUSB*的设备,属性匹配依据生产商编号idVendor和产品号idProduct, 设定读写权限为0777, 符号链接名为user_uart-----PL2303串口转USB, mcu_uart----CH340串口转USB。
idVendor和idProduct由 lsusb -vvv 命令查看。
保存退出后udev规则就生效了,重新拔插两个串口设备,就可以看到/dev/user_uart指向/dev/ttyUSB0, /dev/mcu_uart指向/dev/ttyUSB1. 这样以来,我只要在程序里打开/dev/user_uart或/dev/mcu_uart就可以一直准确的打开指定的串口设备了。
PS:如果您的两个串口用的都是PL2303或者都是CH340/CP2102,那就真的无能为力了。
常用的匹配类型:
* BUS:匹配总路类型,比如PCI USB等
* KERNEL:- 匹配Kernel设备名,比如hda hdb.
* DRIVER :- 匹配Kernel的驱动程序名
* SUBSYSTEM: - 匹配子系统名。
* ID :- 匹配总路系统的ID (e.g. PCI bus ID)。
* PLACE :- 匹配物理位置 (对USB很有用)