시작하고 싶습니다 slcand
(직렬 라인 CAN 인터페이스 드라이버용 사용자 공간 데몬)LawicelCanUSB동글이 연결되어 있습니다. 나는 팔로우한다Pascal Walter의 단계별 가이드모든 것이 작동하는 것 같습니다 (슬칸0거기 있어요?바인딩(2)candump
), 실제로는 아무것도 수신하지 않는다는 점을 제외하면 (Wireshark에서는 나가는 메시지만 볼 수 있습니다).
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"
그리고/usr/local/bin/slcan_add.sh
#!/bin/sh
# Bind the USBCAN device
slcand -o -c -f -s8 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up
그리고/usr/local/bin/slcan_remove.sh
#!/bin/sh
# Remove the USBCAN device
pkill slcand
그러나 수동으로 수행하면 sudo /usr/local/bin/slcan_remove.sh && sudo /usr/local/bin/slcan_add.sh ttyUSB0
모든 것이 예상대로 작동하고 candump slcan0
를 사용하여 모든 CAN 메시지를 볼 수 있습니다.
인터페이스는 udev와 동일합니다. ip link show slcan0
다음을 제공합니다:
91: slcan0: <NOARP,UP,LOWER_UP> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
NetworkManager의 slcan0에 문제가 있는데, 위에서 설명한 대로 slcan0을 수동으로 생성하는 경우에도 발생합니다. tail -f /var/log/syslog
삽입 시 출력은 다음과 같습니다.
May 26 18:29:18 laurenz-T440p logger: [udev] Lawicel CANUSB detected - running slcan_add.sh
May 26 18:29:18 laurenz-T440p slcand[14924]: starting on TTY device /dev/ttyUSB0
May 26 18:29:18 laurenz-T440p slcand[14925]: attached TTY /dev/ttyUSB0 to netdevice slcan0
May 26 18:29:18 laurenz-T440p slcand[14925]: netdevice slcan0 renamed to slcan0
May 26 18:29:18 laurenz-T440p NetworkManager[866]: SCPlugin-Ifupdown: devices added (path: /sys/devices/virtual/net/slcan0, iface: slcan0)
May 26 18:29:18 laurenz-T440p NetworkManager[866]: SCPlugin-Ifupdown: device added (path: /sys/devices/virtual/net/slcan0, iface: slcan0): no ifupdown configuration found.
May 26 18:29:18 laurenz-T440p NetworkManager[866]: <warn> /sys/devices/virtual/net/slcan0: couldn't determine device driver; ignoring...
ps -fauxw | grep can
(수동 시작의 경우 위와 동일):
root 1221 0.0 0.0 4336 100 ? Ss 11:38 0:00 \_ slcand -o -c -f -s8 /dev/ttyUSB0 slcan0
ps -fauxw | grep can
(다시 삽입하면 udev 시작이 시작됩니다):
root 1362 0.0 0.0 4336 96 ? Ss 11:45 0:00 slcand -o -c -f -s8 /dev/ttyUSB0 slcan0
udev에 어떤 문제가 있을 수 있나요? 어떻게 해결할 수 있나요?
고쳐 쓰다:좋아, 그래서 Ixxat USB-to-CAN V2를 추가하고 해당 SocketCan 드라이버를 설치했습니다. 동일한 문제가 있습니다. Tx는 잘 작동하지만 Rx는 작동하지 않습니다.
흥미롭게도 두 개를 함께 연결할 수 있습니다(중간 120R). 그런 다음 candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF
터미널에서 실행합니다. 또 다른 예에서는 CAN 프레임 cansend can0 000#
(CanID 0, 길이 0~can0(Ixxat 어댑터)의 프레임)을 보냅니다 . 결과는 slcand를 수동으로 시작하는지 udev를 통해 시작하는지에 따라 달라집니다.
매뉴얼(위에서 언급한 바와 같이):
$ candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF
(1464614442.246548) can0 TX - - 000 [0]
(1464614442.249320) slcan0 RX - - 000 [0]
작성자: Udev:
$ candump -d -e -c -x -t absolute any,0:0,#FFFFFFFF
(1464614643.800545) can0 RX - - 20000020 [8] 00 00 00 00 00 00 00 00 ERRORFRAME
no-acknowledgement-on-tx
(1464614643.807361) can0 RX - - 20000020 [8] 00 00 00 00 00 00 00 00 ERRORFRAME
no-acknowledgement-on-tx
(1464614643.814058) can0 RX - - 20000020 [8] 00 00 00 00 00 00 00 00 ERRORFRAME
no-acknowledgement-on-tx
(1464614643.820840) can0 RX - - 20000020 [8] 00 00 00 00 00 00 00 00 ERRORFRAME
no-acknowledgement-on-tx
[and so on...]
이 내 꺼야 lsmod | grep can
:
vcan 16384 0
slcan 16384 1
can_dev 24576 2 ixx_pci,ixx_usb
can_raw 20480 0
can 45056 1 can_raw
저는 4.4 커널이 있는 Ubuntu 14.04 시스템을 사용하고 있습니다. uname -rv
:
4.4.0-21-generic #37~14.04.1-Ubuntu SMP Wed Apr 20 16:33:38 UTC 2016
답변1
따라서 Canusb가 udev에서 작동하도록 하는 솔루션은 다음과 같습니다.커트 반 다이크(Kurt van Dijk)가 발견했습니다.:
때로는 uevent가 시작될 때 모든 속성이 존재하지 않기 때문에 udev 규칙에 경쟁 조건이 있을 수 있습니다.
이 업데이트를 사용하면 /usr/local/bin/slcan_add.sh
다음을 삽입할 때 CanUsb가 udev와 제대로 작동할 수 있습니다.
#!/bin/sh
# Bind the USBCAN device
sleep 1
/usr/local/bin/slcand -o -c -f -s8 /dev/$1 slcan0
sleep 2
ifconfig slcan0 up
Ixxat Can-to-Usb V2를 SocketCan과 함께 작동시키는 방법을 찾아야 합니다.
답변2
이 것 같다udev는 장기 실행 프로세스를 처리할 수 없습니다..
slcand는 장기 실행 프로세스를 시작합니다. 위 스레드의 답변 중 하나를 사용하면 문제가 해결됩니다.
내 해결책은 다음과 같습니다.다중 인스턴스 서비스어댑터가 추가되거나 제거되면 시작 및 중지됩니다.
제공하다
[Unit]
Description="Instance of slcand for can #%i"
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/slcan_add %i
slcan_add
#!/bin/sh
/usr/bin/slcand -o -c -f -s8 /dev/tty$1 $1
sleep 2
/sbin/ip link set up $1
/sbin/ip link set $1 txqueuelen 80
while :; do sleep 86400; done
udev 규칙
SUBSYSTEM=="tty", ..., ACTION=="add", SYMLINK+="name1", RUN+="/usr/sbin/service can@name1 start"
SUBSYSTEM=="tty", ..., ACTION=="remove", RUN+="/usr/sbin/service can@name1 stop"
.. idVendor, idProduct 및 CAN 어댑터의 일련번호가 포함되어 있습니다.
지침:
장치에 대해 여러 slcan 인스턴스를 실행하면 문제가 발생할 수 있습니다. slcan 인스턴스가 이미 실행 중인지 확인하는
데 사용됩니다 . 다음 명령은 다음을 포함하는 명령으로 시작된 모든 프로세스를 종료합니다 .ps aux | grep slcan
slcan
sudo kill $(ps aux | grep slcand | awk -F ' ' '{print $2}' | head -1)