Home:ALL Converter>What is the python-can equivalent of sending socket CAN message?

What is the python-can equivalent of sending socket CAN message?

Ask Time:2022-08-10T00:58:07         Author:ITregear

Json Formatter

I have code that communicates with a motor over CAN, originally written to work on a Linux machine. I want to run it on Windows, and I believe the socket-can libraries are not supported for Windows, and so I am trying to use python-can instead.

The original two lines are:

can_msg = struct.pack(self.motor_params["CAN_FRAME_FMT_SEND"], self.motor_id, can_dlc, data)
CanMotorController.motor_socket.send(can_msg)

Where self.motor_params["CAN_FRAME_FMT_SEND"]="=IB3x8s", self.motor_id=0x01, can_dlc=8, and data=b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC".

I have tried to translate this to python-can using the following two lines instead:

can_msg = can.Message(arbitration_id=self.motor_id, data=data, is_extended_id=False)
CanMotorController.bus.send(can_msg)

Printing can_msg in the first case results in: b'\x01\x00\x00\x00\x08\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xfc' and in the second case: Timestamp: 0.000000 ID: 0000 S Rx DL: 8 ff ff ff ff ff ff ff fc.

Although this successfully sends, and I can see the CAN Rx LED flash on the serial-can converter (implying something is sent), the motor doesn't appear to send anything back, as the recv function which later runs always returns None.

How should I write the can.Message() function to achieve the same result as with the original code?

Edit: Added CAN protocol for specific motor.

Screenshot of CAN Communication Protocol from AK10-9 V2 motor datasheet

Author:ITregear,eproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/73295547/what-is-the-python-can-equivalent-of-sending-socket-can-message
yy