2013-05-05 71 views
1

我目前使用POPEN發送指令給一個實用程序(canutils ......特別是cansend功能)通過命令行。用於CAN總線訪問的Popen更快的替代方案?

整個函數看起來是這樣的。

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函數)更快?

+1

你嘗試過在Python版本['蟒蛇-can'(http://python-can.readthedocs.org/en/latest/)3.3之前? – jfs 2014-04-05 20:27:27

回答

4

我懷疑,大多數時間是由於分叉每次運行cansend時間的開銷。爲了擺脫它,你需要一種方法,不必爲每次發送創建一個新的進程。

this blog postSocketCAN被蟒蛇3.3的支持。它應該讓你的程序直接創建並使用CAN套接字。這可能是你想要去的方向。

+0

hmmmm ....我實際上已經在類中設置了我的_CANSend函數。我想我可以初始化類的實例化過程,然後根據需要發送消息。這似乎是一個合適的方法(我只是剛開始使用子進程) – Chris 2013-05-05 02:37:05

+0

此外,(我應該提到這一點)我使用的是一個跟python 2.7一起發貨的beaglebone,所以一個解決方案可以用在那個案件更可取 – Chris 2013-05-05 02:38:05

+0

如果您的代碼正在調用Popen,那麼它正在創建一個新流程來完成其工作。將其移入課程不會改變這一點。 – 2013-05-05 02:41:23