【问题标题】:Faster alternatives to Popen for CAN bus access?CAN 总线访问 Popen 的更快替代方案?
【发布时间】:2013-05-05 01:23:41
【问题描述】:

我目前正在使用 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 毫秒的时间执行...每隔一行小于 2 us。

那么...有什么更好的方法可以更快地调用cansend 函数(同样,它是canutils 实用程序的一部分..._CANSend 是上面调用的python 函数)?

【问题讨论】:

  • 你在 Python 3.3 之前的版本上试过python-can 吗?

标签: python linux popen can-bus socketcan


【解决方案1】:

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

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

【讨论】:

  • hmmmm.... 我实际上在一个类中设置了我的 _CANSend 函数。我想我可以在类的实例化时初始化该过程,然后根据需要发送消息。这似乎是一种合适的方法(我才刚刚开始使用子流程)
  • 另外,(我应该提到这一点)我使用的是带有 python 2.7 的 beaglebone,所以在这种情况下可以使用的解决方案更可取
  • 如果您的代码正在调用 Popen,那么它正在创建一个新进程来完成其工作。将它移到一个类中不会改变这一点。
  • 您的选择似乎是: (a) 为您的 beaglebone 获取 python 3.3 版本。 (b) 用 C 语言编写程序并直接访问 CAN API。 (c) 编写 python 2.7 扩展或使用动态库模块从 python 2.7 访问 CAN API。 (d) 编写或找到一个程序,该程序可以根据来自另一个程序的命令执行多个 CAN 操作,并从 python 中命令它的单个实例。
  • 选项 a) 可能是最简单的。
猜你喜欢
  • 2011-10-08
  • 2018-12-11
  • 2012-07-05
  • 2012-01-23
  • 2013-07-13
  • 2011-02-27
  • 2010-09-22
  • 2017-05-15
相关资源
最近更新 更多