我目前正在使用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
帧实际执行发送帧的命令),但发现Popen行正在某处执行35 ms ...每隔一行不到2 us。
那么......调用cansend
函数的更好方法(同样,它是canutils
实用程序的一部分...... _CANSend
是上面的python函数那叫“更快”?
答案 0 :(得分:4)
我怀疑大部分时间是由于每次运行cansend时分叉的开销。要摆脱它,你需要一种不必为每次发送创建新进程的方法。
根据this blog post,python 3.3支持SocketCAN。它应该让你的程序直接创建和使用CAN套接字。这可能是你想要的方向。