При разработке очередного устройства на микроконтроллере, столкнулся с ситуацией, где требовалась непрерывная регистрации большого количества данных. Устройство должно было сохранять набор данных, состоящий из метки времени и результатов измерений шести АЦП от 100 раз в секунду на SD карту (назовем этот набор данных — пакетом), а затем эти данные анализировать на компьютере в виде графиков. Также было необходимо параллельно с записью данных на SD карту, передавать их по UART. Эти данные должны были занимать как можно меньше места, так как данных ну уж очень много. При этом нужно было как-то разделять эти пакеты, потому что данные шли непрерывным потоком. Порывшись в интернете ничего хорошего, не нашел, поэтому было принято решении о создании собственного протокола и библиотек под него. В результате некоторых раздумий было решено следующие: в протоколе данные будут передаваться пакетами состоящими из N байт, где первый бит каждого байта отводится на признак стартового бита для синхронизации пакетов (отсюда и название протокола), остальные семь бит отводятся под данные. Последовательность и размеры данных известны заранее. Пример: Под метку времени выделим 32 бита, под измерения АЦП 60 бит (6 каналов по 10 бит), итого требуется 92 бита. Так как у нас в байте можно передать 7 бит полезных данных, то пакет будет состоять из 14 байт (92 бита / 7бит = 13,14… округляем в большую сторону получается 14). В 14 байтах 112 бит информации, из которых 14 бит занято признаком стартового бита 92 бита полезных данных, остается 6 неиспользуемых бит (в которые можно записать еще какую-нибудь информацию, но для простоты примера не будем их использовать).   Где 7-ой бит – признак стартового бита (обозначает начало пакета), 6,5,4,3,2,1,0 – биты данных. Приемная сторона также знает, что получает пакет из 14 байт в которых первый бит первого байта — стартовый бит (1) (в остальных байтах стартовые биты 0), далее в битах данных по порядку идут 32 бита метки времени, затем 10 бит измерения АЦП№1, затем 10 бит АЦП№2 и так далее…  Аналогично проходит запись на SD карту и чтение с нее согласно протоколу. Итого за одни сутки записи на SD карту у нас получается 115,4 Мб информации (14 байт х 100 измерений в секунду х 3600 сек х 24 часа). Такая структура данных еще удобна тем, что в последующем мы можем с любого места файла выбрать блоки данных и вывести их в виде графиков, тем самым, не загружая весь файл в оперативную память (который может достигать нескольких десятков гигабайт). А также сможем реализовать удобный скроллинг этих графиков подгружая нужные пакеты.   Библиотеку под микроконтроллер пишем на С++. Для удобства создадим класс: С методом инициализации думаю все понятно: С методом добавления данных посложнее, здесь путем хитрых поразрядных манипуляций размещаем данные в нашем массиве байт. Метод получения массива байт пакета: И напоследок пару вспомогательных функций: В результате проделанной работы «родился» компактный протокол потоковой передачи данных PSP1N и готовые библиотеки, которые можно скачать с GitHub тут. В данном репозитории вы найдете: Для демонстрации работы протокола можно прошить скетч в Ардуину и в примере ExampleSerialPortRead на компьютере получать данные с микроконтроллера через COM port. Там эти данные дешифруются и отображаются в консольном приложении. Про библиотеку написанную на C# для приемной стороны я расскажу в другой раз. TestingConsole:  Разработка ПО