我在python中使用cantool来解码从socketcan读取的一些CAN消息。在python中,我可以从套接字读取消息并简单地使用以下代码对其进行解码:
message = can_bus.recv()
decoded_msg = db.decode_message(msg.arbitration_id, msg.data)
其中can_bus是套接字,db是dbc加载的文件。现在我从.dbc文件开始生成了C文件.h和.c。如何使用自动生成的文件解码在C中接收的CAN消息?我可以通过这种方式从套接字读取消息(在C中):
nbytes = read(s, &frame, sizeof(struct can_frame));
其中s是套接字,帧是存储接收帧的地方。如何使用.h和.c自动生成的文件解码接收到的帧?
cantools生成称为..._unpack
的函数。
他们的第二个参数叫做src_p
。这是你输入接收字节的地方。
假设您正在使用Linux的CAN网络层,那么您的代码将是类似的
struct my_message myMessage;
my_message_unpack(&myMessage,
can_frame.data,
can_frame.can_dlc);
这将填充结构myMessage
。
在大多数情况下,您必须解码此结构的各个成员,即将原始(二进制)表示转换为符号值。这可以通过使用由cantools生成的..._decode
函数来完成。