简单介绍在ubuntu下进行设备和串口名称绑定的操作,保证每次连接设备时可以直接使用,不需要更改。
其中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.rulesusb.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 下绑定串口名称