Простой пример производителя-потребителя для отправки и получения сообщений CAN не получает сообщения

Я просто пытался использовать виртуальное устройство can vcan0 под linux и модуль python-can, чтобы познакомиться с программированием и отладкой по CAN-шине.

Я разработал простую программу с двумя потоками, где один поток должен создавать сообщения can, которые другой поток должен потреблять. К сожалению, ни одно сообщение не используется потоком-потребителем, и я немного озадачен этой причиной.

import can
import time
import threading

bus=can.interface.Bus(bustype='socketcan', channel='vcan0')

def producer():
    for i in range(10):
       msgProduced=can.Message(0., 20, data=[0,1,2,3])
       bus.send(msgProduced)
 
def consumer():
    for i in range(10):
       msgRecv=bus.recv(timeout=0.1)
       print(msgRecv)

producerThread=threading.Thread(target=producer)
consumerThread=threading.Thread(target=consumer)
producerThread.start()
consumerThread.start()
producerThread.join()
consumerThread.join()

bus.shutdown()

Настройка интерфейса vcan0 выполняется легко после установки драйверов виртуального устройства can:

sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

person Aleph0    schedule 16.09.2020    source источник


Ответы (1)


По умолчанию кадры CAN, отправленные шиной SocketCAN, не принимаются этой шиной. Чтобы это работало, установите для параметра receive_own_messages значение True при создании шины. См. https://python-can.readthedocs.io/en/master/interfaces/socketcan.html#can.interfaces.socketcan.SocketcanBus.

person Jos Seldenthuis    schedule 22.09.2020