c - 使用cantools生成C文件

标签 c sockets decode can-bus auto-generate

我在Python中使用cantools来解码从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 是套接字,frame 是存储接收到的帧的位置。 如何使用 .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 函数来完成。

关于c - 使用cantools生成C文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55418695/

相关文章:

c - 有没有办法解决使用管道函数创建的文件描述符的关闭问题

c - 非可变参数函数如何接受不同数量的参数(与其定义的参数数量不同)?

java - 如何在 Java SE 中使用 SSL 设置相互身份验证

ios - NSDataBase64DecodingOptions 总是返回 nil

c - 如何读取以逗号分隔的大于 999 的数字(例如 10,000)?

c - 试图将指针地址传递给另一个指针

java - 是否有 HTML5 WebSockets 的 Java 小程序实现?

java - 串联/不间断套接字编程

php - 如何使用加密 key 在设备端加密并在服务器端解密

javascript - 在 JavaScript 中解码 url 字符串