Skip to content

Polytech-VM-Team/csup

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CSUP

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();
}