udev 규칙은 구별하지 않습니다

udev 규칙은 구별하지 않습니다

Sparkfun FTDI 칩과 Arduino Uno에 연결된 Neato XV-* LiDAR 장치가 있습니다. 예측할 수 없을 정도로 할당되지 않은 /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

출력을 각각 lsusb. IS_SERIAL_SHORT출력에서 가져옵니다.

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

또는

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

그러나 이 명령은 FTDI/LiDAR에서 작동하지만 Arduino에서만 제공되고 ID_SERIAL.ID_SERIAL_SHORT

sudo service udev restart모니터링하는 동안 장치를 연결하고 분리하려고 하면 마지막 으로 연결한 장치와 두 장치 모두 에 대해 심볼릭 링크가 나타나는 것을 watch 'ls -lah /dev | grep ">"'볼 수 있습니다 . 즉, 지금까지 나는 과 를 보았습니다 . 하지만 플러그를 뽑았다가 다시 연결하면 둘 다 해당 상태로 전환됩니다.arduinounoneatolidarttyUSB*arduinouno -> ttyUSB1neatolidar -> ttyUSB1ttyUSB0

내 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')

ENV(ID_SERIAL_SHORT)(1) 내 규칙이 작동하지 않고 (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

관련 정보