Более быстрые альтернативы 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-сокеты напрямую. Это, вероятно, направление, которое вы хотите пойти.