Микроконтроллеры | Коды Хэмминга и прочие |
|
---|---|---|
В процессе работы появилась необходимость передавать данные довольно большие растояния (до 200 м) через обычный опторазвязанный UART. Возникли проблемы с помехами и ошибками при передаче данных. Решил применить кодирование данных, в часности использовать код Хэмминга, но возникла проблема с преобразованием данных. Подскожите, как выделить биты из байта, обработать их, и собрать обратно в байт, или есть другой алгоритм обработки (кодирования, декодирования), не требующий выделения битов. Работаю на С для 51 ядра. Может, кто подскажет другие простые способы защиты передаваемях данных (в системе обратной связи нет). |
|
|
Если под "защитой" данных имеется защита от искажений (есть еще от несанкционированного доступа ), без отсутствия обратной связи никаких надежных средств в природе не существует. Коды Хэмминга дают возможность восстановить один испорченный бит, во всех остальных случаях они только сигнализируют об ошибке - исправить ее нельзя. Хотя 99% всех ошибок - одиночные, остается все равно 1%, на котором не повезет. В качестве простого варианта можно посоветовать передавать информацию дважды: первый байт - в нормальном виде, второй - в инверсном. Именно так передаются коды команд в протоколе USB. Не совсем понятно, в чем проблема при разборе битов. Если лень возиться с масками, можете воспользоваться стандартными возможностями языка С: union и далее: x.received = принятый_байт; можете работать индивидуально с каждым битом как с отдельной переменной. Экономии кода эта конструкция, конечно, не даст, но писать будет проще. |
|
|
Crazyd Что касается защиты от порчи информации -- метод сильно зависит от загруженности канала. |
|
|
chav1961: В качестве простого варианта можно посоветовать передавать информацию дважды: первый байт - в нормальном виде, второй - в инверсном. Именно так передаются коды команд в протоколе USB chav1961: Если лень возиться с масками, можете воспользоваться стандартными возможностями языка С caddr: На таком расстоянии нужен RS-485 |
|
|
Crazyd |
|
|
chav1961: передавать информацию дважды: первый байт - в нормальном виде, второй - в инверсном |
|
|
Да, только для обнаружения. Впрочем, в каком именно бите произошла ошибка, здесь определить все-таки можно - достаточно выполнить "исключающее или" над этими байтами. Где вылез 0, там бит наврал. Правда, определить, каким именно способом он наврал, нельзя - для этого надо передавать не 2 байта, а хотя бы 3 (например, 2 прямых, один инверсный - и там уже прикидывать к носу ) Без обратной связи помехозащищенные протоколы не делаются - не нужно строить иллюзий Байт ведь может просто тупо не дойти... И никакой Хэмминг тут не спасет. |
|
|
Именно так, я себе это и представлял. |
|
|
Да, команды в USB либо принимаются, либо не принимаются. Инверсия же гарантирует, что за команду не будет принята какая-нибудь бредятина из сплошных нулей (единиц). Блок данных там защищен по-человечески, т.е. контрольной суммой. Не мучайтесь, добавьте в протокол отправку байта подтверждения. |
|
|
chav1961: Коды Хэмминга дают возможность восстановить один испорченный бит, во всех остальных случаях они только сигнализируют об ошибке - исправить ее нельзя. |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |