udev-配置

引言

在Ubuntu系统中使用串口时,串口名常常以/dev/ttyUSB0,/dev/ttyACM0等形式出现,用以区分不同设备。当多个相同类型的设备被接入系统时,如/dev/ttyACM*类型设备,会出现/dev/ttyACM0,/dev/ttyACM1,/dev/ttyACM2等多个串口名。串口名后数字用于区分不同设备,该数字通常由设备上电的顺序决定。当编写程序读取多个同类设备时,不同设备对应的程序可能不同,但由于程序中的串口名是给定好的,这就对设备上电的顺序有了要求。例如:Arduino串口和某RTK-GPS设备串口名都是/dev/ttyACM*,程序1用于读取Arduino串口,串口名设置为/dev/ttyACM0,程序2用于读取RTK-GPS串口,串口名设置为/dev/ttyACM1,当上电顺序不同时,程序可能会出错。

为了使设备名不受接入系统(上电)顺序的影响,可以采用udev对不同设备配置不同型号。

udev 示例

一个编写好的,用于设置某设备静态串口名的udev文件如下所示:

1
KERNEL=="ttyACM*", ATTRS{idVendor}=="1546",ATTRS{idProduct}=="01a9",SYMLINK="ttyGPS"

KERNEL:系统匹配的原串口名;
idVendor:厂商号;
idProduct:产品号;
SYMLINK:设置的静态串口名,以软链接的形式存在。
将该文件以NUM-FILENAME.rules的形式保存在/etc/udev/rules.d文件下,重启系统后,系统若识别到满足要求的设备,就会添加/dev/ttyGPS软链接,指向/dev/tyyACM*。该文件名中的NUM指示了系统运行各种.rules文件的顺序,取值范围为0~99。例如命名某.rules文件

其中idVendor和idProduct可以由lsusb指令查询得到

1
$ lsusb

如下Bus 004,ID中1d6b表示idVendor,0003表示idProduct。

1
2
3
4
5
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 8087:0033 Intel Corp.
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

相关指令

查看当前连接的设备

1
$ ls /dev/

查看当前连接的某类型设备,如:ttyACM*

1
$ ls /dev/ttyACM*

查看电脑连接的串口设备

1
$ lsusb

相关链接

udev规则以及编写