Дописал протокол, пока ещё в стадии тестирование но основное написано и скорее всего меняться не будет.
Протокол доступен тут
https://github.com/linvinus/sprtВкратце
1) протокол бинарный
2) для того чтобы разделять команды между собой используется COBS кодирование , я о нём упоминал тут
post326658.html#p3266583) есть поддержка уведомления о доставке
4) есть уведомление об ошибках протокола (неправильная чексумма, неверный размер команды, несуществующая команда и т.п)
5) есть возможность задавать команды как фиксированного размера так и произвольного размера.
6) простая стандартизация команд
7) синхронный и асинхронный режим работы
8 ) возможность вызывать callback при получении и доставке, ответ (uint8_t) от callback функции доставленного сообщения будет отправлен в уведомлении о доставке, это можно использовать для простого и быстрого RPC.
9) достаточно лекгопортируется, основной алгоритм не привязан к ОС.
10) уже есть реализация для chibios,arduino и linux.
Кодирование примечательно тем что на каждые 255 байт произвольных данных даёт лишь один байт накладных расходов, это реально круто (правда у меня ограничен размер 246 байтами).
Но есть и недостаток, нельзя в один проход кодировать данные и отправлять в последовательный порт, поскольку суть кодирования в том что после каждого экранируемоего символа ставится число сколько не экранируемых байт до следующего экранируемого байта, а пока не вычислишь сколько байт до следующего, текущий передавать нельзя.
Но с другой стороны во первых всё равно высчитывать checksum который я отправляю в заголовке,
во вторых для приёма команд всё равно нужен буфер, поскольку принимающая сторона не может сказать правильная ли чексумма пока не примет все байты данных, а до момента отправки полученных данных в функцию получателя нужно убедиться что чексумма верная.
Для того чтобы стандартизировать протокол между разными сторонами, все команды должный быть описаны в одном массиве который выделен в отдельный заголовочный файл и должен быть подключен и на хосте и на МК.
В общем я готов выслушать вашу критику
Перед созданием протокола я рассматривал протоколы firmata, mavlink может ещё что то, но я уже не вспомню.
Производительность:
переслать 16 байт данных с уведомлением по usb uart на 115200 бод занимает 3ms.
Это 22 байта в одну сторону и 6 байт обратно.
по bluetooth 2 этаже операция занимаем 35-40ms.