Popen用于CAN总线访问的更快替代方案?

时间:2013-05-05 01:23:41

标签: python linux popen can-bus socketcan

我目前正在使用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函数那叫“更快”?

1 个答案:

答案 0 :(得分:4)

我怀疑大部分时间是由于每次运行cansend时分叉的开销。要摆脱它,你需要一种不必为每次发送创建新进程的方法。

根据this blog post,python 3.3支持SocketCAN。它应该让你的程序直接创建和使用CAN套接字。这可能是你想要的方向。