udev规则不区分

udev规则不区分

我有一个 Neato XV-* 激光雷达单元,与 Sparkfun FTDI 芯片和 Arduino Uno 连接。它们显示为/dev/ttyUSB0/dev/ttyUSB1,不可预测地未分配。

所以,我写道/etc/udev/rules.d/80-arduinouno.rules

SUBSYSTEM=="tty",
ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86",
MODE="0666",
OWNER="pi", GROUP="pi",
SYMLINK+="arduinouno"

... 和/etc/udev/rules.d/90-neatolidar.rules

SUBSYSTEM=="tty", ENV(ID_SERIAL_SHORT)=="AL01OTZS",
ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AL01OTZS",
MODE="0666", OWNER="pi", GROUP="pi",
SYMLINK+="neatolidar"

idProductidVendor取自第一行

udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idProduct

udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idVendor

分别与 的输出交叉引用lsusbIS_SERIAL_SHORT是从输出中取出的

udevadm info -q all -n /dev/ttyUSB0 | grep ID_SERIAL

或者

udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep {serial}

但是,虽然此命令适用于 FTDI/激光雷达,但它只为 Arduino提供了ID_SERIAL,而不是。ID_SERIAL_SHORT

当我执行 a sudo service udev restart,然后尝试在监视时插入和拔出设备watch 'ls -lah /dev | grep ">"',我会看到两者 arduinouno以及最后插入的设备neatolidar都出现符号链接。ttyUSB*也就是说,目前我看到了arduinouno -> ttyUSB1neatolidar -> ttyUSB1。但如果我拔掉插头并重新插入ttyUSB0,两者都会切换到那个状态。

如何让我的 udev 规则区分这两个设备,并且仅在检测到正确的设备时触发?

如果重要的话,这是在运行 Raspbian Jessie 的 Raspberry Pi 3 上。 Arduino 直接连接到 RPi,而FTDI连接到廉价的黄色EagleTec 4 端口 USB 集线器

答案1

我的声誉似乎不够高,无法发表评论。

另外:我使用以下 bash 脚本重新加载我的 udev 规则并重新触发,因此我什至不需要拔出并重新插入设备:

#!/bin/bash

sudo udevadm control --reload-rules
sudo udevadm trigger

答案2

运行sudo udevadm control --log-priority=info,然后观察 的输出tail -f /var/log/syslog,我注意到一些错误。

Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 1,starting at character 17 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 2,starting at character 50 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 3,starting at character 12 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 4,starting at character 23 ('\n')

Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: unknown key 'ENV(ID_SERIAL_SHORT)' in /etc/udev/rules.d/90-neatolidar.rules:1
Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid rule '/etc/udev/rules.d/90-neatolidar.rules:1'
Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid key/value pair in file /etc/udev/rules.d/90-neatolidar.rules on line 2,starting at character 77 ('\n') Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid key/value pair in file /etc/udev/rules.d/90-neatolidar.rules on line 3,starting at character 36 ('\n')

由此推断(1)我的ENV(ID_SERIAL_SHORT)规则不起作用,(2)我不应该有换行符。因此,我更改为以下一行 .rules 文件:

/etc/udev/rules.d/80-arduinouno.rules

SUBSYSTEM=="tty", ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="arduinouno"

/etc/udev/rules.d/90-neatolidar.rules

SUBSYSTEM=="tty", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AL01OTZS", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="neatolidar"

重新启动后(或者可能只是sudo service udev restart和/或sudo udevadm control --reload),这似乎有效。

相关内容