Эта программа превращает файл DBC в несколько различных форматов.
Can-FD в настоящее время не поддерживается .
Пожалуйста, рассмотрите возможность пожертвования в проект, если вы найдете его полезным. Этот проект требует, чтобы ваша поддержка продолжилась. Если вам требуется платная поддержка, пожалуйста, свяжитесь с Mailto: [email protected].
Как вы можете видеть по большей ноте выше, Can-FD в настоящее время не поддерживается и, вероятно, не будет (какое-то время). Проблема заключается в том, что CAN-FD позволяет сообщать более 64-битные длины, и этот проект и код, сгенерированный из него
DBCC - это программа для преобразования файла DBC, главным образом, в C -код, который может сериализовать и десериализовать сообщения в структуры, которые представляют эти сообщения и сигналы. Также возможно распечатать информацию, содержащуюся в структуре.
См. Файл лицензии для получения подробной информации о лицензии на эту программу, она выпускается по лицензии MIT. Зависимости, если они связаны, могут иметь свою собственную лицензию и свой собственный набор ограничений, если они построены.
Источники файл MPC.C и MPC.H происходят из комбинатора анализатора, написанного в C, называемом MPC, и лицензированы в соответствии с лицензией BSD 3.
Чтобы построить, вам нужен только компилятор C (C99) и сделать (вероятно, сделать GNU, я не прилагаю усилий, чтобы поддержать другие реализации). Сама программа DBCC она написала в том, что должно быть портативным C с единственной внешней зависимостью - ваша библиотека C.
Вы должны быть в состоянии печатать:
make
Для построения производится исполняемый файл под названием «DBCC». Чтобы проверить запуск тестов, требуется XMLLINT.
-n может использоваться для указания выходной версии, которая может дать вам доступ к предыдущему поведению, если будет реализована обратная совместимость. Вы можете указать версию для использования в командной строке с опцией -n . Последняя версия будет использоваться по умолчанию.
Версия 1:
Наследие/оригинальное поведение. Обратите внимание, что это по -прежнему не обеспечит стабильный выход, но у него будет больше шансов не иметь нарушающих изменений.
Версия 2:
Последняя версия
Имена перечисления квалифицированы с именем сообщения CAN
Имена функций Encode/Decode также квалифицированы с именем сообщения
Генератор кода может сделать код для распаковки сообщения (превратить некоторые байты в структуру данных), расшифровать сообщение (применить минимальное количество масштабирования/смещения и максимальные значения к значениям в структуре данных), а обратное может быть сделано (Pack/Encode).
Вы можете посмотреть на код, сгенерированный из файлов DBC в рамках проекта, чтобы понять, как он должен работать.
Если вы хотите обработать сообщение CAN, которое вы получили, вам нужно будет вызвать «unpack_message». Созданный код является агностиком по сравнению с байтовым порядком процессоров, он требует значения «uint64_t», содержащего один пакет CAN (вместе с ID CAN и DLC для этого пакета) и распаковывает это в структуру, которую он генерирует. Первый байт пакета 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' вызывает правильную функцию распаковки для этого идентификатора, в качестве примера для идентификатора '0x020':
case 0x020: return unpack_can_0x020_MagicCanNode1RBootloaderAddress(&o->can_0x020_MagicCanNode1RBootloaderAddress, data, dlc);
Функция распаковки заполняет объект сообщения в структуре 'can_obj_ex1_h_t' для этого идентификатора. Затем отдельные сигналы могут быть декодированы соответствующими функциями для этого сигнала. Например:
uint16_t b = 0;
if (decode_can_0x020_MagicNode1R_BLAddy(o, &b)) {
/* error */
}
Для передачи сообщения каждый сигнал должен быть закодирован, затем функция пакета вернет упакованное сообщение.
Некоторые другие заметки:
Как я понимаю, спецификации формата файла DBC см. DBC.MD. Это работа в процессе.
В проекте есть файл синтаксиса VIM для файлов DBC, который называется DBC.VIM
Помимо C, можно сгенерировать XML, проект содержит файл XSD и XSLT для сгенерированного XML.
Файл на основе XML, который может быть импортирован в Beyond Security Bestorm и используется для тестирования инфраструктуры шины CAN.
Можно сгенерировать плоский файл 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-width: 850px; line-height: 1.6; размер шрифта: 16px; цвет:#444; Padding: 0 10px} H1, H2, H3 {Line-Height: 1.2} </style>} H1, H2, H3 {Line-Height: 1,2} </style> style>