SocketCAN 소켓 설정을 위한 Udev 규칙은 수동으로 실행할 때만 작동합니다.

SocketCAN 소켓 설정을 위한 Udev 규칙은 수동으로 실행할 때만 작동합니다.

시작하고 싶습니다 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)

관련 정보