引言
在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 | Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub |
相关指令
查看当前连接的设备
1 | $ ls /dev/ |
查看当前连接的某类型设备,如:ttyACM*
1 | $ ls /dev/ttyACM* |
查看电脑连接的串口设备
1 | $ lsusb |