二、DBCC

DBCC 相关内容
DBCC的含义是 DBC converter/compiler ,DBC文件的翻译/转换器,它可以把DBC文件转换成不同的格式,目前不支持CAN-FD
DBCC git地址

介绍

dbcc 是一个程序,用于将 DBC 文件主要转换为 C 代码,该代码可以将 CAN 消息序列化和反序列化为表示这些消息和信号的结构。 也可以打印出结构中包含的信息

构建

源文件 mpc.c 和 mpc.h 源自一个用 C 编写的称为 MPC 的解析器组合器,并在第 3 条 BSD 许可下获得许可。
要构建,您只需要一个 C (C99) 编译器和 Make(可能是 GNU make,我不努力支持其他 Make 实现)。 dbcc 程序本身是用可移植的 C 编写的,唯一的外部依赖是您的平台 C 库

只需要输入

make

为了构建,会生成一个名为“dbcc”的可执行文件。 要测试运行测试,需要 xmllint
在这里插入图片描述

C 编码标准

  • 如有疑问,请使用“-linux”选项缩进格式化。
  • 使用制表符而不是空格进行格式化
  • 尽可能使用断言(不是用于错误检查,用于检查前置/后置条件和不变量)。
  • 该工具应无需修改即可在 Windows 和 Linux 上运行。 该项目是用纯 C 语言编写的。
  • 不应将外部依赖项带入项目

如何使用生成的代码

代码生成器可以编写代码来解包消息(将一些字节转换为数据结构),解码消息(将缩放/偏移最小值和最大值应用于数据结构中的值),并且可以完成相反的操作(打包 /编码)

您可以查看从项目中的 DBC 文件生成的代码,以了解它应该如何工作

如果要处理收到的 CAN 消息,则需要调用“unpack_message”。 代码生成与 CPU 字节顺序无关,它采用包含单个 CAN 数据包(以及该数据包的 CAN ID 和 DLC)的“uint64_t”值,并将其解包到它生成的结构中。 CAN 数据包的第一个字节应放在 ‘uint64_t’ 的最低有效字节中

您可以使用以下函数来转换为/从 CAN 消息

static uint64_t u64_from_can_msg(const uint8_t m[8]) {
	return ((uint64_t)m[7] << 56) | ((uint64_t)m[6] << 48) | ((uint64_t)m[5] << 40) | ((uint64_t)m[4] << 32) 
		| ((uint64_t)m[3] << 24) | ((uint64_t)m[2] << 16) | ((uint64_t)m[1] << 8) | ((uint64_t)m[0] << 0);
}

static void u64_to_can_msg(const uint64_t u, uint8_t m[8]) {
	m[7] = u >> 56;
	m[6] = u >> 48;
	m[5] = u >> 40;
	m[4] = u >> 32;
	m[3] = u >> 24;
	m[2] = u >> 16;
	m[1] = u >>  8;
	m[0] = u >>  0;
}

代码生成器将根据 DBC 文件的文件名创建一个结构,因此对于示例 DBC 文件“ex1.dbc”,创建了一个名为“can_obj_ex1_h_t”的数据结构。 该结构包含所有 CAN 消息结构,而这些结构又包含所有信号。 将所有消息/信号放在一个结构中既有优点也有缺点,它使更容易的一件事是定义所需的数据结构。

/* reminder of the 'unpack_message' prototype */
int unpack_message(can_obj_ex1_h_t *o, const unsigned long id, uint64_t data, uint8_t dlc);

static can_obj_ex1_h_t ex1;

uint8_t can_message_raw[8];
unsigned long id = 0;
uint8_t dlc = 0;
your_function_to_receive_a_can_message(can_message_raw, &id, &dlc);
if (unpack_message(&ex1, id, can_message_u64, dlc) < 0) {
	// Error Condition; something went wrong
	return -1;
}

‘unpack_message’ 为该 ID 调用正确的解包函数,例如 ID ‘0x020’:

uint16_t b = 0;
if (decode_can_0x020_MagicNode1R_BLAddy(o, &b)) {
	/* error */
}

要传输消息,必须对每个信号进行编码,然后 pack 函数将返回一个打包的消息

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值