解决ubuntu16.04中ttyUSB设备节点不固定问题

时间:2021-10-28 16:24:54

这两天在ubuntu中开发跟串口有关程序时,发现来回拔插串口线或者插多个串口线时总是出现串口号ttyUSB*不固定的问题, 给应用程序带来不少麻烦,遂google解决。

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很有用)

资料链接:

http://www.cnblogs.com/ynxf/p/6379449.html

http://biancheng.dnbcw.net/linux/295328.html