CAN python-can `.send_periodic()` работает, но вылетает при использовании `.send()`

Подключение от ноутбука 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() не может быть использован, поскольку он отправляет одно и то же сообщение повторно. Тем не менее, когда я пытаюсь петлю ва .send() примерно с той же скоростью, мое соединение останавливается. То есть, когда мы запускаем код, мы можем увидеть candump (который пассивно контролирует и выводит все сообщения CAN на экран) остановка, но не ошибка.

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

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

0 ответов

Другие вопросы по тегам