Cyphal CAN

Когда устройство становится достаточно сложным, появляется потребность в коммуникации между контроллерами, или между контроллером и компьютером (например, Raspberry Pi). Для этого в микроконтроллерах STM32G4 встроен модуль FDCAN. Этот протокол является популярным и достаточно гибким способом построения коммуникационных сетей, однако он не предоставляет никаких абстракций над пакетами байтов, которыми оперирует.

Для целей общения между устройствами, нами был выбран прокол Cyphalarrow-up-right, создающий слой абстракции над FDCAN без потерь в скорости и дающий возможность передавать структурированные сообщения произвольной длины, а не просто байты.

circle-info

У этого протокола есть и множество других достоинств, описание всего протокола выходит за рамки этой докуменации, подробнее о нем можно прочитать тутarrow-up-right.


libcxxcanard

Нами была разработана и проверена на множестве устройств универсальная C++ библиотека для работы с cyphal (на основе libcanard) - libcxxcanardarrow-up-right. Далее будет дан обзор возможностей и типичных примеров использования данной библиотеки.

circle-info

Подробная документация - read-the-docsarrow-up-right

Примеры - libcyphal-docsarrow-up-right

chevron-rightКороткое сравнение с libcanardhashtag

libcxxcanard основана на libcanard и призвана упростить ее использование. Далее несколько наглядных сравнений "на пальцах" (на картинки лучше нажать, чтоб рассмотреть подробнее):

Дальше будут параллельно разбираться примеры для linux (raspberry pi) и stm32g4. Считается, что сделаны следующие инклюды:

#include <cyphal/cyphal.h>
#include <cyphal/allocators/o1/o1_allocator.h>
#include <cyphal/subscriptions/subscription.h>

Инициализация

Код инициализации короткий и кроссплатформенный, надо только выбрать нужный провайдер:

Подписки и отправка сообщений

По сравнению с libcanard, работа с отправкой/приемом сообщений гораздо проще. Есть единственное неудобство: из-за того что libcxxcanard работает поверх сишного libcanard, для любого используемого типа сообщений нужно (единожды) использовать макрос TYPE_ALIAS - TYPE_ALIAS(УдобноеНовоеНазваниеТипа, сгенерированный_cyhal_тип_сообщения).

Минимальный пример, echo-сервиса:

Развернутый пример подписчика на обычные сообщения, связанного с ROS (для linux):