سؤال

I'm currently using Popen to send instructions to a utility (canutils... the cansend function in particular) via the command line.

The entire function looks like this.

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 was running into some issues as I was trying to send frames (the Popen frame actually executes the command that sends the frame) in rapid succession, but found that the Popen line was taking somewhere on the order of 35 ms to execute... every other line was less than 2 us.

So... what might be a better way to invoke the cansend function (which, again, is part of the canutils utility..._CANSend is the python function above that calls ) more rapidly?

هل كانت مفيدة؟

المحلول

I suspect that most of that time is due to the overhead of forking every time you run cansend. To get rid of it, you'll want an approach that doesn't have to create a new process for each send.

According to this blog post, SocketCAN is supported by python 3.3. It should let your program create and use CAN sockets directly. That's probably the direction you'll want to go.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top