CSUP (Cross-platform Safe UART Protocol) - лёгкий, надёжный, кроссплатформенный протокол обмена данными поверх UART, предназначенный для встраиваемых систем.
Протокол обеспечивает безопасную передачу данных между устройствами, защищая сообщения от потерь, искажений и коллизий с помощью подтверждений и проверки целостности.
- Проверка целостности данных - CRC-16 (алгоритм CCITT-FALSE).
- Подтверждение доставки (ACK) - гарантирует успешную передачу сообщений.
- Обнаружение и разрешение коллизий - если оба устройства отправляют данные одновременно.
- Системное сообщение HEARTBEAT - проверка активности соединения и синхронизация передачи.
- Фиксированный внутренний буфер - исключает динамическое выделение памяти.
- Минимальный накладной размер - протокол увеличивает длину сообщения на 6 байт.
Полное описание структуры сообщений, типов системных сообщений и кодов результата доступно в файле: docs/protocol.md.
| Папка | Описание |
|---|---|
csup/hal/ |
Абстракции аппаратного слоя (UART, таймеры, типы) |
csup/hal/<platform>/ |
Реализация HAL для конкретной платформы (Arduino, Linux и т.д.) |
csup/protocol/ |
Реализация протокола CSUP, включая COBS и структуру сообщений |
csup/utils/ |
Утилиты для работы с буферами и проверки целостности |
csup/definitions.hpp |
Общие определения |
csup/csup.hpp |
Основной заголовочный файл библиотеки |
Вся логика протокола CSUP построена на интерфейсах, определяемых через HAL (Hardware Abstraction Layer). Это позволяет использовать протокол на любой платформе, для которой реализована HAL-обёртка.
На данный момент поддерживаются Arduino и Linux.
Пользователь может создавать собственные обёртки для UART и таймера, а затем выбирать их при создании экземпляра протокола:
template <typename Uart = hal::DefaultUart,
typename Time = hal::DefaultTime,
typename Crc = CRC16_CCITT_FALSE,
CollisionBehavior Collision = CollisionBehavior::BALANCED,
types::size MaxMsgSize = 256>
class Protocol;Таким образом, один и тот же код протокола может работать на разных платформах без изменений, используя соответствующие реализации HAL.
CSUP - это заголовочная библиотека, не требующая сборки.
Для установки достаточно скопировать папку csup в каталог с заголовочными файлами вашего проекта или в стандартный путь поиска компилятора.
После этого вы сможете подключать библиотеку в коде:
#include <csup/csup.hpp>В папке examples/ содержатся готовые примеры работы протокола CSUP для различных платформ.
Простой пример для Linux:
#include "csup/csup.hpp"
#include <iostream>
int main()
{
csup::hal::UartConfig cfg;
cfg.device = "/dev/ttyUSB0";
csup::Result result;
csup::Protocol<> protocol;
result = protocol.start(cfg);
if (result != csup::Result::SUCCESS)
{
std::cerr << "Failed to start CSUP\n";
return -1;
}
// Send a simple message with ACK
uint8_t data[10] = {0,1,2,3,4,5,6,7,8,9};
csup::BufferView buf(data, sizeof(data));
result = protocol.send(0x10, buf, true);
if (result != csup::Result::SUCCESS)
{
std::cerr << "Send error\n";
return -1;
}
// Receive a response
csup::BufferView recv;
uint8_t type;
result = protocol.receive(type, recv);
if (result != csup::Result::SUCCESS)
{
std::cerr << "Receive error\n";
return -1;
}
std::cout << "Received message of type " << int(type) << "\n";
// Check connection
protocol.heartbeat();
protocol.stop();
}