CAN python-can `.send_periodic ()` работает, но вылетает при использовании `.send ()` - PullRequest
0 голосов
/ 17 января 2019

Подключение от ноутбука Ubuntu к автомобильной CAN через OBD2 к Kvaser Leaflight 2, запуск can-utils / socketcan и модуля python-can.

В следующем коде разрывается соединение с CAN

bus = can.interface.Bus(bustype='socketcan',channel='can0')
for i,p in enumerate(payloads):
    msg = can.Message(arbitration_id = pid, data = p, extended_id = False)
    bus.send(msg)
    time.sleep(0.005)

В частности, он вызывает набор ошибок битов материала.Предположительно это происходит из-за ошибок.

Тем не менее, следующий код работает нормально:

bus.send_periodic(msg , 0.005, 10) ## send `msg` every 0.005s for 10s

Моя проблема в том, что я хотел бы адаптировать каждое сообщение на основе наблюдений почти в реальном времени, поэтому .send_periodic() не можетиспользовать, поскольку он отправляет одно и то же сообщение повторно.Тем не менее, когда я пытаюсь выполнить цикл, равный примерно 1012 *, примерно с той же скоростью, мое соединение останавливается.То есть, когда мы запускаем код, мы видим остановку candump (которая пассивно отслеживает и выводит все сообщения CAN на экран), но не ошибку.

Интересно, что это происходит только для одного PID.То есть мы можем правильно выполнять обе версии кода на других идентификаторах PID, и они, похоже, работают без ошибок!

Есть идеи о том, что здесь происходит?Начинаю думать, что это «особенность» конкретного транспортного средства для защиты от этого PID.

...