Вам нужно отправить 10 битов, и поскольку вы отправляете байт за раз, вы должны отправить 16 битов. Большой вопрос - насколько скорость является приоритетом и насколько синхронизированы отправитель и получатель? Я могу придумать 3 ответа, в зависимости от этих условий.
Регулярная выборка, неизвестная точка соединения
Если устройство работает все время, вы не уверены, когда собираетесь подключаться (вы можете присоединиться в любое время в последовательности), но частота дискретизации ниже скорости связи, поэтому вам не важен размер Я думаю, что я, вероятно, сделал бы это следующим образом. Предположим, вы пытаетесь отправить десять бит abcdefghij
(каждая буква один бит).
Я бы отправил pq0abcde
, затем pq1fghij
, где p
и q
являются битами проверки ошибок . Таким образом:
- разделитель не требуется (вы можете сказать, какой байт вы читаете по 0 или 1)
- вы определенно можете обнаружить любую 1-битную ошибку, чтобы вы знали о неверных данных
Я изо всех сил пытаюсь найти хороший двухбитный код с исправлением ошибок, поэтому, я думаю, я бы просто сделал бит четности pa для битов 2,3 и 4 (0, ab выше) и бит четности q для 5 6 и 7 (с, д, е выше). Это может быть понятнее с примером.
- Предположим, я хочу отправить 714 = 1011001010.
- Разделить на 2 10110, 01010
- Добавить биты для обозначения первого и второго байта 010110, 101010
- вычисление четности для каждой половины: p0 = par (010) = 1, q0 = par (110) = 0, p1 = par (101) = 0, q1 = par (010) = 1
- байтов равны 10010110, 01101010
Затем вы можете обнаружить множество различных состояний ошибки, быстро проверить, какой байт вы отправляете, если вы потеряете синхронизацию, и ни одна из операций не займет очень много времени в микроконтроллере (я бы выполнил паритет с поиском 8 записей) таблицу).
Плотные данные, известная точка соединения
Если вы знаете, что считыватель запускается одновременно с записывающим устройством, просто отправьте 4 десятибитные значения в виде 5 байтов. Если вы всегда читаете 5 байтов за раз, тогда никаких проблем. Если вы хотите еще больше сэкономить место и уже имеете хороший пример данных, я бы сжал, используя код Хаффмана .
Плотные данные, неизвестная точка соединения
В 7 байтах вы можете отправить 5 десятибитных значений с 6 запасными битами. Отправьте 5 значений следующим образом:
- байт 0: 0 (7 бит)
- байт 1: 1 (7 бит)
- байт 2: 1 (7 бит)
- байт 3: 1 (7 бит)
- байт 4: 0 (7 бит)
- байт 5: 0 (7 бит)
- байт 6: (8 бит)
Тогда всякий раз, когда вы видите 3 1 в ряду для самого значимого бита, вы знаете, что у вас есть байты 1, 2 и 3. Эта идея тратит 1 бит из 56, поэтому ее можно сделать еще более эффективной, но вы бы чтобы отправить больше данных одновременно. Например (5 последовательных, 120 бит отправлено в 16 байтах):
- байт 0: 0 (7 бит) 7
- байт 1: 1 (7 бит), 14
- байт 2: 1 (7 бит) 21
- байт 3: 1 (7 бит) 28
- байт 4: 1 (7 бит) 35
- байт 5: 1 (7 бит) 42
- байт 6: 0 (7 бит) 49
- байт 7: (8 бит) 57
- байт 8: (8 бит) 65
- байт 9: (8 битов) 73
- байт 10: (8 бит) 81
- байт 11: 0 (7 бит) 88
- байт 12: (8 бит) 96
- байт 13: (8 бит) 104
- байт 14: (8 бит) 112
- байт 15: (8 бит) 120
Это довольно забавная проблема!