设备绑定串口名称 Ubuntu

tech2023-12-15  80

设备绑定串口名称 Ubuntu

1. 概述2. 查看3. 配置关键点 4. 规则说明5. 其他5.1 常用的查看串口命令5.2 其他设备 6. idProduct和idVendor相同的处理办法7. 参考链接

1. 概述

简单介绍在ubuntu下进行设备和串口名称绑定的操作,保证每次连接设备时可以直接使用,不需要更改。

2. 查看

cd /etc/udev/

其中rules.d目录中就是设置的设备和串口名关系

/etc/udev$ ls -l total 12 drwxr-xr-x 2 root root 4096 4月 12 2016 hwdb.d drwxr-xr-x 2 root root 4096 7月 13 01:59 rules.d -rw-r--r-- 1 root root 153 4月 12 2016 udev.conf

进入rules.d目录,可以看到已有的设备关系,每个rules文件中都包含对应的关系。

:/etc/udev$ cd ./rules.d/ robots@Robots-ubuntu1604:/etc/udev/rules.d$ ls -l total 12 -rw-r--r-- 1 root root 360 7月 5 18:33 88-mvusb.rules -rw-r--r-- 1 root root 109 5月 28 23:01 mynteye-d1000.rules -rw-r--r-- 1 root root 101 7月 13 01:59 usb.rules

例如usb.rules中就是之前已经设定好的串口名和设备关系

gedit usb.rules

usb.rules中的具体内容有

KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="nano"

可以新建一个rules文件,注意权限问题可以在命令前加一个sudo

sudo touch myusb.rules

3. 配置

在需要配置的rules文件中需要添加信息,这个只适用于USB连接的设备ttyUSB*,注意两点

idVendor和idProduct可以标识一个设备,对于设备连接时通过这两个代码可以查找正确的设备sbgN是绑定的串口名称,可以设置一个比较容易记的名字。0777是设备权限,这里默认是所有人都有全部权限,根据需要可以自行更改,如果设置错误可能会出现不能读取数据的现象。 KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE:="0777", SYMLINK+="sbgN"

关键点

比较重要的就是idVendor和idProduct如何获取,可以通过下面的命令快速得到。

通过dmesg

下面显示了具体的信息New USB device found, idVendor=2639, idProduct=0017, bcdDevice= 0.00

[ 3019.003797] xsens_mt ttyUSB0: xsens_mt converter now disconnected from ttyUSB0 [ 3019.003851] xsens_mt 1-9:1.1: device disconnected [ 3028.116303] usb 1-10: new full-speed USB device number 7 using xhci_hcd [ 3028.270598] usb 1-10: New USB device found, idVendor=2639, idProduct=0017, bcdDevice= 0.00 [ 3028.270605] usb 1-10: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 3028.270609] usb 1-10: Product: MTi-G-700 GPS/INS 使用lsusb

也可以在输出中找到对应的信息 2639:0017

robots@Robots-ubuntu1604:~/catkin_ws$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 017: ID 04f2:b59e Chicony Electronics Co., Ltd Bus 001 Device 034: ID f622:1041 Bus 001 Device 002: ID 17ef:602d Lenovo Bus 001 Device 005: ID 8087:0aaa Intel Corp. Bus 001 Device 032: ID 2639:0017 Xsens MTi-G 7xx GNSS/INS Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

使用下面的命令使更改立即生效。

sudo udevadm trigger

使用命令ls -l查看设置是否生效,可以看到,这只是一种映射关系罢了,或者说给串口设置了别名。通过Vendor和product来找到对应的设备,设置限制在ttyUSB*的名称中。可以看到dev/sbgN和设备ttyUSB0连接在了一起

$ ls -l /dev/sbgN lrwxrwxrwx 1 root root 7 9月 3 17:15 /dev/sbgN -> ttyUSB0

4. 规则说明

具体的udev文件规则说明如下

键 含义 ---------------------------------------- ACTION 事件 (uevent)的行为,例如:add( 添加设备 )、remove(删除设备 )。 KERNEL 在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备 DEVPATH 内核设备录进,比如/devices/* SUBSYSTEM 子系统名字,例如:sda的子系统为 block。 BUS 总线的名字,比如IDE,USB DRIVER 设备驱动的名字,比如ide-cdrom ID 独立于内核名字的设备名字 SYSFS{ value} sysfs属性值,他可以表示任意 ENV{ key} 环境变量,可以表示任意 PROGRAM 可执行的外部程序,如果程序返回0值,该键则认为为真(true) RESULT 上一个PROGRAM调用返回的标准输出。 NAME 根据这个规则创建的设备文件的文件名。 注意:仅仅第一行的NAME描述是有效的,后面的均忽略。 如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。 SYMLINK 为 /dev/下的设备文件产生符号链接。由于 udev只能为某个设备产生一个设备文件, 所以为了不覆盖系统默认的 udev规则所产生的文件,推荐使用符号链接。 OWNER 设备文件的属组 GROUP 设备文件所在的组。 MODE 设备文件的权限,采用8进制 RUN 为设备而执行的程序列表 LABEL 在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务) GOTO 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO IMPORT{ type} 导入一个文件或者一个程序执行后而生成的规则集到当前文件 WAIT_FOR_SYSFS 等待一个特定的设备文件的创建。主要是用作时序和依赖问题。 PTIONS 特定的选项: last_rule 对这类设备终端规则执行; ignore_device 忽略当前规则; ignore_remove 忽略接下来的并移走请求。 all_partitions 为所有的磁盘分区创建设备文件。

运算符的规则如下

操作符 匹配或赋值t 解释 ---------------------------------------- == 匹配 相等比较 != 匹配 不等比较 = 赋值 分配一个特定的值给该键,他可以覆盖之前的赋值。 += 赋值 追加特定的值给已经存在的键 := 赋值 分配一个特定的值给该键,后面的规则不可能覆盖它。

5. 其他

5.1 常用的查看串口命令

查看usb简略信息

lsusb

查看每个usb详细信息

lsusb -v

查看系统启动以来的usb接口等设备信息,可以方便的看到设备是否已经连接,相对具体的设备信息。

dmesg

更详细信息的查看命令

$ udevadm info --attribute-walk --name=/dev/ttyUSB0

5.2 其他设备

有的设备不是使用的ttyUSB*名称,这种时候需要单独考虑。 例如mindvision相机的挂载点不是ttyusb,注意一下,具体可以看官方有个配置文件88-mvusb.rules

KERNEL=="*", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ACTION=="add", ATTR{idVendor}=="f622", MODE="666", TAG="mvusb_dev", A" KERNEL=="*", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ACTION=="add", ATTR{idVendor}=="080b", MODE="666", TAG="mvusb_dev", A" KERNEL=="*", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ACTION=="remove", TAG=="mvusb_dev", R"

因此可以对应在我们自己的rules文件中进行修改得到

KERNEL=="*", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="f622", ATTRS{idProduct}=="1041", MODE:="0777", SYMLINK+="MdVn"

至于其他的设备,用到了再继续添加吧。

6. idProduct和idVendor相同的处理办法

有时候后会出现idProduct和idvendor相同的情况,这是很常见的。处理的方法如下 请注意idProduct和idvendor相同并不能区分不同设备,但是每个设备都有一个唯一的序列号,因此这里可以添加一个规则,序列号规则那么如何得到序列号呢 可以使用dmesg得到序列号

dmesg

也可以使用下面命令得到

$ udevadm info --attribute-walk --name=/dev/ttyUSB0

当然,lsusb -v也可以得到呀

那我们看一下具体是怎么不同呢,可以看到,他们的kernel不同,表示这是两个接口上的设备,但是他们的idProduct和idvendor相同,都是6001:0403,那怎么办呢?进一步可以看到,他们的serial,也就是SerialNumber序列号是不一样,因此可以在原来的文件中添加规则就可以了,经过测试,完美!

ATTRS{serial}="AD0JFGI6"

7. 参考链接

udev的使用 Ubuntu 下绑定串口名称

最新回复(0)