该程序将DBC文件变成了许多不同的格式。
CAN-FD当前不支持。
如果您觉得有用,请考虑向项目捐款。该项目需要您的支持才能继续。如果您需要付费支持,请联系mailto:[email protected]。
正如您可以从上面的大笔记中看到的那样,Can-FD当前不支持,并且可能不会(有一段时间)。问题在于,CAN-FD允许长度高于64位的消息,并且该项目以及从中生成的代码使人们假设8位全部旨在包含一个可以包含的罐头消息。
DBCC是一个程序,用于将DBC文件主要转换为C代码,该文件可以序列化并进行序列化can消息到表示这些消息和信号的结构。也可以打印出结构中包含的信息。
有关此程序许可的详细信息,请参见许可证文件,它是根据MIT许可证发布的。依赖项(如果链接),则可能具有自己的许可证和自己的限制。
来源文件mpc.c和mpc.h源自C撰写的一个名为MPC的解析器组合,并根据3条BSD许可获得许可。
要构建,您只需要一个C(C99)编译器就可以制造(可能是GNU,我不用努力支持其他实现)。 DBCC程序本身本身写在应该是便携式C的内容中,唯一的外部依赖关系是您的平台C库。
您应该能够输入:
make
为了构建,产生了一个名为“ DBCC”的可执行文件。要测试测试,需要XMLLINT。
-n选项可用于指定输出版本,如果实现了向后兼容,则可以使您访问以前的行为。 您可以在带有-n选项的命令行上指定要使用的版本。默认情况下将使用最新版本。
版本1:
遗产/原始行为。请注意,这仍然无法提供稳定的输出,但会有更大的机会不破坏变化。
版本2:
最新版本
枚举名称有资格带有CAN消息名称
编码/解码函数名称也有消息名称的资格
代码生成器可以使代码解开消息(将某些字节转换为数据结构),解码消息(将缩放/偏移最小值应用最小值和最大值应用于数据结构中的值),并且可以完成逆(pack/encode)。
您可以查看项目中DBC文件生成的代码,以了解其应如何工作。
如果您想处理已收到的罐头消息,则需要调用“ unpack_message”。代码生成的CPU字节顺序不可知,它采用一个包含单个CAN数据包的“ UINT64_T”值(以及该数据包的CAN ID和DLC),并将其解开为其生成的结构。罐数据包的第一个字节应放在“ UINT64_T”的最低字节中。
您可以使用以下功能转换为可以/从可以发消息:
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;
}
“ uncack_message”调用该ID的正确拆卸功能,作为ID'0x020'的示例:
case 0x020: return unpack_can_0x020_MagicCanNode1RBootloaderAddress(&o->can_0x020_MagicCanNode1RBootloaderAddress, data, dlc);
拆卸功能在该ID的“ CAN_OBJ_EX1_H_T”结构中填充了消息对象。然后可以用适当的函数对该信号解码单个信号。例如:
uint16_t b = 0;
if (decode_can_0x020_MagicNode1R_BLAddy(o, &b)) {
/* error */
}
要传输消息,每个信号必须编码,然后包装功能将返回包装的消息。
其他一些注释:
据我了解,有关DBC文件格式的规范,请参见DBC.MD。这是一项正在进行的工作。
项目中有一个用于DBC文件的VIM语法文件,称为DBC.vim
以及C,可以生成XML,该项目还包含生成XML的XSD和XSLT文件。
可以将基于XML的文件导入超越安全性的最佳词,并用于测试CAN BUS基础架构。
可以生成平坦的CSV文件,这更容易导入Excel。
可以生成一个JSON文件,这是所有很酷的孩子如今使用的。
请咨询《手册》页面以获取有关该程序精确操作的更多信息。
可以生成良好的(ASCII ART)图像,以显示消息的构造方式,这有助于理解有关的消息,并且对于文档目的很有用,例如:
Message Name: Example-1
Message ID: 0x10, 16
DLC: 1 (8-bits)
+-----+-----.-----.-----.-----+-----.-----+-----+
| | | | |
| | | | |
+-----+-----.-----.-----.-----+-----.-----+-----+
0 1 2 3 4 5 6 7
Bit 0: Signal-Name-1, 1 bit signal, scalar 1.0, offset 0
Bits 1-2: Signal-Name-2, 4 bit signal, signed, Motorola, ...
... etcetera ...
或类似的东西。这将是另一个输出模块。
<style type =“ text/css”> body {margin:40px auto; max宽:850px; line-height:1.6; font-size:16px; color:#444; padding; padding:0 10px} h1,h2,h2,h2,h3 {line-height:1.2}} </style>:1.2} </style>:1.2} </style> </style>