該程序將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>