我有一个 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"
idProduct
并idVendor
取自第一行
udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idProduct
和
udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idVendor
分别与 的输出交叉引用lsusb
。IS_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 -> ttyUSB1
和neatolidar -> 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
),这似乎有效。