Более быстрые альтернативы Popen для доступа к шине CAN?

В настоящее время я использую Popen для отправки инструкций в утилиту (canutils... cansend в частности) через командную строку.

Вся функция выглядит следующим образом.

def _CANSend(self, register, value, readWrite = 'write'):
    """send a CAN frame"""
    queue=self.CANbus.queue
    cobID = hex(0x600 + self.nodeID)     #assign nodeID
    indexByteLow,indexByteHigh,indexByteHigher,indexByteHighest = _bytes(register['index'], register['objectDataType'])
    subIndex = hex(register['subindex'])
    valueByteLow,valueByteHigh,valueByteHigher,valueByteHighest = _bytes(value, register['objectDataType'])
    io = hex(COMMAND_SPECIFIER[readWrite])
    frame = ["cansend", self.formattedCANBus, "-i", cobID, io, indexByteLow, indexByteHigh, subIndex, valueByteLow, valueByteHigh, valueByteHigher, valueByteHighest, "0x00"]
    Popen(frame,stdout=PIPE)
    a=queue.get()
    queue.task_done()
    return a

Я столкнулся с некоторыми проблемами, когда пытался отправить кадры (Popen frame фактически выполняет команду, которая посылает кадр) в быстрой последовательности, но обнаружил, что выполнение строки Popen занимало где-то порядка 35 мс... каждая вторая строка была меньше 2 мкс.

Итак... что может быть лучшим способом вызвать cansend функция (которая, опять же, является частью canutils полезность..._CANSend функция Python выше, которая вызывает) быстрее?

1 ответ

Решение

Я подозреваю, что большая часть этого времени происходит из-за накладных расходов на разветвление каждый раз, когда вы запускаете cansend. Чтобы избавиться от этого, вам понадобится подход, при котором не нужно создавать новый процесс для каждой отправки.

Согласно этому сообщению в блоге, SocketCAN поддерживается Python 3.3. Это должно позволить вашей программе создавать и использовать CAN-сокеты напрямую. Это, вероятно, направление, которое вы хотите пойти.

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