简单介绍在ubuntu下进行设备和串口名称绑定的操作,保证每次连接设备时可以直接使用,不需要更改。
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
在需要配置的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
具体的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 解释
----------------------------------------
== 匹配 相等比较
!= 匹配 不等比较
= 赋值 分配一个特定的值给该键,他可以覆盖之前的赋值。
+= 赋值 追加特定的值给已经存在的键
:= 赋值 分配一个特定的值给该键,后面的规则不可能覆盖它。
查看usb简略
信息
lsusb
查看每个usb详细
信息
lsusb -v
查看系统启动以来的usb接口等设备
信息,可以方便的看到设备是否已经连接,相对具体的设备信息。
dmesg
更详细信息的查看命令
$ udevadm info --attribute-walk --name=/dev/ttyUSB0
有的设备不是使用的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"
至于其他的设备,用到了再继续添加吧。
有时候后会出现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"
udev的使用
Ubuntu 下绑定串口名称