Использование cantools сгенерированных файлов C - PullRequest
0 голосов
/ 29 марта 2019

Я использую cantools в python для декодирования некоторых сообщений CAN, прочитанных из socketcan.В python я могу прочитать сообщение из сокета и декодировать его просто:

message = can_bus.recv()
decoded_msg = db.decode_message(msg.arbitration_id, msg.data)

, где can_bus - сокет, а db - загруженный файл dbc.Теперь я сгенерировал файлы C .h и .c, начиная с моего файла .dbc.Как я могу декодировать сообщение CAN, полученное в C, используя автоматически сгенерированные файлы?Я могу прочитать сообщение из сокета следующим образом (в C):

nbytes = read(s, &frame, sizeof(struct can_frame));

, где s - сокет, а frame - это место, где хранится полученный кадр.Как я могу декодировать полученный кадр, используя автоматически сгенерированные файлы .h и .c?

1 Ответ

0 голосов
/ 01 апреля 2019

Cantools генерируют функции с именем ..._unpack.

Их второй параметр называется src_p.Здесь вы вставляете полученные байты.

Если вы используете сетевой уровень CAN в Linux, ваш код будет выглядеть примерно так:

struct my_message myMessage;
my_message_unpack(&myMessage,
                  can_frame.data,
                  can_frame.can_dlc);

Это заполнит структуру myMessage.

В большинстве случаев вам необходимо декодировать отдельные элементы этой структуры, то есть преобразовать необработанное (двоичное) представление в символическое значение.Это можно сделать с помощью функций ..._decode, сгенерированных cantools.

...