Мы разработали простой протокол фиксированной длины для встроенного устройства. Каждый пакет состоит всего из двух байтов:
bits | 15..12 | 11..4 | 3..0 |
| OpCode | DATA | CRC4 |
Мы используем «кадрирование на основе crc», т.е. получатель собирает два байта, вычисляет CRC4 и, если он соответствует кадру, считается действительным. Как видите, нет ни начала, ни конца кадра.
Есть одна загвоздка: рекомендуемая длина сообщения для CRC4 составляет 11 бит, а здесь она вычисляется для 12 бит. Насколько я понимаю, это означает, что свойства обнаружения ошибок CRC ухудшаются (но я не уверен, насколько).
(Кстати, если кому-то нужен код для CRC4 (или любого другого) и он не чувствует себя достаточно опытным, чтобы написать его сам, у boost есть очень хорошая функция boost :: crc, которая может вычислить любой crc)
Проблема в том, что это кадрирование на основе crc не работает, и мы получаем ошибки кадрирования, то есть второй байт из одного сообщения и первый байт из следующего сообщения иногда формируют правильное сообщение.
У меня вопрос - есть ли способ исправить кадрирование без добавления байтов? Мы проводим довольно много времени, сжимая все в этих двух байтах, и было бы грустно просто выбросить их вот так. Однако у нас есть запасной бит в поле кода операции.
- Фрейминг по времени будет не очень надежным, потому что наш радиоканал любит "плевать" сразу несколько пакетов.
- Может быть, есть какой-нибудь другой метод обнаружения ошибок, который будет работать лучше, чем CRC4?
Если нам нужно добавить больше байтов, как лучше всего это сделать?
- Мы можем использовать байт начала кадра и заполнение байтов (например, COBS) (+2 байта, но я не уверен, что делать с поврежденными сообщениями)
- Мы можем использовать полубайт начала кадра и расширить CRC до CRC8 (+1 байт)
- Что-то другое?