2013-05-05 5 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 
I 프레임을 보내려고 나는이 몇 가지 문제로 실행중인

이는 popen 라인의 순서 어딘가에 복용 것을 연속으로 빠르게합니다 (Popen 프레임 실제로 프레임을 전송하는 명령을 실행), 그러나 발견 실행하려면 35 밀리언 ... 한 줄 걸러 줄었습니다.

cansend 함수를 호출하는 더 좋은 방법은 무엇입니까? (canutils 유틸리티의 일부입니다 ... _CANSend은 위의 파이썬 함수보다 더 빠르게 호출됩니다)?

+1

3.3 이전의 Python 버전에서 ['python-can'] (http://python-can.readthedocs.org/en/latest/)을 사용해 보셨습니까? – jfs

답변

4

나는 그 시간의 대부분이 당신이 cansend를 실행할 때마다 forking의 오버 헤드 때문이라고 생각한다. 이를 없애기 위해서는 각 전송에 대해 새로운 프로세스를 생성 할 필요가없는 접근 방식이 필요합니다.

this blog post에 따르면 SocketCAN은 python 3.3에서 지원됩니다. 그것은 당신의 프로그램이 직접 CAN 소켓을 만들고 사용할 수 있도록해야합니다. 그것은 아마 당신이 가고 싶어하는 방향 일 것입니다.

+0

hmmmm .... 사실 내 _CANSend 함수는 클래스 내부에 설정되어 있습니다. 클래스의 인스턴스 생성시 프로세스를 초기화 한 다음 필요에 따라 메시지를 보낼 수 있다고 가정합니다. 그게 적절한 접근 방식처럼 보이나요 (난 단지 하위 프로세스를 사용하기 시작했습니다) – Chris

+0

또한, (그리고 내가 이것을 언급해야합니다) 저는 파이썬 2.7과 함께 제공되는 비글 본을 사용하고 있습니다. 그래서이 솔루션에서 사용할 수 있습니다 대/소문자가 적합합니다. – Chris

+0

코드가 Popen을 호출하는 경우 작업을 수행 할 새 프로세스가 생성됩니다. 클래스로 이동하면 변경되지 않습니다. –