Lawicel CAN 어댑터를 사용하여 센서에 연결하고 있으며 수동 캔 설정을 피하기 위해 udev 규칙을 설정하고 싶습니다.
설명서는 다음과 같이 설정할 수 있습니다.
sudo slcand -o -c -f -s6 /dev/ttyUSB0 slcan0
sudo ifconfig slcan0 up
이를 실행하면 candump slcan0
데이터를 인쇄하여 연결이 유효하다는 것을 알 수 있습니다.
그래서 저는 udev 규칙 설정 가이드를 따르고 있습니다.협회. 그러나 이것은 작동하지 않습니다. udev 규칙은
# Lawicel CANUSB module
ACTION=="add", ENV{ID_MODEL}=="CANUSB", ENV{SUBSYSTEM}=="tty", RUN+="/usr/bin/logger [udev] Lawicel CANUSB detected - running slcan_add.sh!", RUN+="/usr/local/bin/slcan_add.sh $kernel"
ACTION=="remove", ENV{ID_MODEL}=="CANUSB", ENV{SUBSYSTEM}=="usb", RUN+="/usr/bin/logger [udev] Lawicel CANUSB removed - running slcan_remove.sh!", RUN+="/usr/local/bin/slcan_remove.sh"
스크립트 slcan_add.sh
는
#!/bin/sh
# Bind the USBCAN device
slcand -o -c -f -s6 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up
그런 다음 규칙을 다시 로드하고 udev를 다시 시작했는데 tail -f /var/log/syslog
다음이 반환되었습니다.
morten@thinkpad:~$ tail -f /var/log/syslog
Oct 7 10:56:21 thinkpad kernel: [ 1580.917239] usb 1-1: Detected FT232RL
Oct 7 10:56:21 thinkpad kernel: [ 1580.918002] usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0
Oct 7 10:56:21 thinkpad mtp-probe: checking bus 1, device 10: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1"
Oct 7 10:56:21 thinkpad mtp-probe: bus: 1, device: 10 was not an MTP device
Oct 7 10:56:21 thinkpad root: [udev] Lawicel CANUSB detected - running slcan_add.sh!
Oct 7 10:56:21 thinkpad slcand[5967]: starting on TTY device /dev/ttyUSB0
Oct 7 10:56:21 thinkpad slcand[5968]: attached TTY /dev/ttyUSB0 to netdevice slcan0
Oct 7 10:56:21 thinkpad slcand[5968]: netdevice slcan0 renamed to slcan0
Oct 7 10:56:21 thinkpad NetworkManager[649]: <info> [1633596981.6497] manager: (slcan0): new Generic device (/org/freedesktop/NetworkManager/Devices/8)
Oct 7 10:56:21 thinkpad systemd-udevd[5954]: ethtool: autonegotiation is unset or enabled, the speed and duplex are not writable.
Oct 7 10:56:23 thinkpad snapd[668]: hotplug.go:199: hotplug device add event ignored, enable experimental.hotplug
Oct 7 10:56:23 thinkpad mtp-probe: checking bus 1, device 10: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1"
Oct 7 10:56:23 thinkpad mtp-probe: bus: 1, device: 10 was not an MTP device
Oct 7 10:56:26 thinkpad ModemManager[791]: <info> [base-manager] couldn't check support for device '/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1': not supported by any plugin
Oct 7 10:56:27 thinkpad gnome-shell[1997]: Removing a network device that was not added
Oct 7 10:56:27 thinkpad gnome-shell[1426]: Removing a network device that was not added
그리고 candump slcan0
반환 SIOCGIFINDEX: No such device
. 이 문제를 어떻게 해결해야 합니까?
노트: 우분투 20.04를 사용하고 있습니다.
편집하다:udev 규칙이 장치를 올바르게 식별하고 스크립트를 실행하므로 udev 규칙이 작동해야 한다고 생각합니다. USB 포트를 수동으로 설정하고 쉘 스크립트를 실행하면 sudo ./sclan_add.sh
다음과 같이 작동합니다 .tail -f /var/log/syslog
Oct 7 12:53:26 agrirobot slcand[20933]: starting on TTY device /dev/ttyUSB0
Oct 7 12:53:26 agrirobot slcand[20934]: attached TTY /dev/ttyUSB0 to netdevice slcan0
Oct 7 12:53:26 agrirobot slcand[20934]: netdevice slcan0 renamed to slcan0
Oct 7 12:53:26 agrirobot NetworkManager[649]: <info> [1633604006.8360] manager: (slcan0): new Generic device (/org/freedesktop/NetworkManager/Devices/22)
Oct 7 12:53:26 agrirobot systemd-udevd[20936]: ethtool: autonegotiation is unset or enabled, the speed and duplex are not writable.
나는 쉘 스크립트를 호출하는 udev 규칙에 어떤 문제가 있는지 실제로 알지 못하지만 어떤 이유로 이것이 차이를 만듭니다.
답변1
해결책은 부분적으로 다음에서 영감을 얻은 것의 조합이었습니다.이것.
udev 규칙
# Lawicel CANUSB module
ACTION=="add", ENV{ID_MODEL}=="CANUSB", ENV{SUBSYSTEM}=="tty", RUN+="/usr/local/bin/slcan_add_wrapper.sh $kernel"
slcan_add_wrapper.sh
#!/bin/sh
# Call shell script binding can device
/usr/bin/logger "[udev] Lawicel CANUSB detected - running /usr/local/bin/slcan_add.sh on $1"
echo /usr/local/bin/slcan_add.sh $1 | at now
slcan_add.sh
#!/bin/sh
# Bind the USBCAN device
sleep 1
/usr/bin/logger "binding $1 to slcan0"
slcand -o -c -f -s6 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up
설명하다
at
해결책은 udev kill 스크립트가 너무 오래 걸리고 잠자기 없이 터미널에서 수동으로 실행하는 sleep
것을 방지하기 위한 익스플로잇의 조합입니다. 그러나 어떤 이유로 udev 규칙은 잠자기 없이 실행을 거부하고 이유를 모르겠으며 더 이상 원하지 않습니다. 이것.slcan_add.sh
slcan_add.sh
누군가가 더 깨끗한 해결책을 찾으면 나는 그것을 받아들일 것입니다.