Свежие обсуждения
Микроконтроллеры

Коды Хэмминга и прочие

1 3

В процессе работы появилась необходимость передавать данные довольно большие растояния (до 200 м) через обычный опторазвязанный UART. Возникли проблемы с помехами и ошибками при передаче данных. Решил применить кодирование данных, в часности использовать код Хэмминга, но возникла проблема с преобразованием данных. Подскожите, как выделить биты из байта, обработать их, и собрать обратно в байт, или есть другой алгоритм обработки (кодирования, декодирования), не требующий выделения битов. Работаю на С для 51 ядра. Может, кто подскажет другие простые способы защиты передаваемях данных (в системе обратной связи нет).
Спасибо!!!

 

Если под "защитой" данных имеется защита от искажений (есть еще от несанкционированного доступа ), без отсутствия обратной связи никаких надежных средств в природе не существует. Коды Хэмминга дают возможность восстановить один испорченный бит, во всех остальных случаях они только сигнализируют об ошибке - исправить ее нельзя. Хотя 99% всех ошибок - одиночные, остается все равно 1%, на котором не повезет. В качестве простого варианта можно посоветовать передавать информацию дважды: первый байт - в нормальном виде, второй - в инверсном. Именно так передаются коды команд в протоколе USB.

Не совсем понятно, в чем проблема при разборе битов. Если лень возиться с масками, можете воспользоваться стандартными возможностями языка С:

union
{char received;
struct
{char bit_0 : 1;
char bit_1 : 1;
. . .
char bit_7 : 1;
} bytes;
} x;

и далее:

x.received = принятый_байт;
if (x.bytes.bit_0 & x.bytes.bit_3 | и всякая прочая хрень) .....

можете работать индивидуально с каждым битом как с отдельной переменной. Экономии кода эта конструкция, конечно, не даст, но писать будет проще.

 

Crazyd
обычный опторазвязанный UART
- Если подразумевается RS-232, то это просто безумие. На таком расстоянии нужен RS-485 (дифференциальный сигнал).

Что касается защиты от порчи информации -- метод сильно зависит от загруженности канала.
В случае малой загруженности можно многократно дублировать пакеты данных (каждый пакет содержит контрольную сумму и идентификационный номер).

 

chav1961: В качестве простого варианта можно посоветовать передавать информацию дважды: первый байт - в нормальном виде, второй - в инверсном. Именно так передаются коды команд в протоколе USB
Спасибо -- это мысль. Скорость передани не велика (2400), да и данные передаются 1 раз в сек., поэтому данные можно и повторить раза 3 или 5 и выбрать по max правдоподобия.

chav1961: Если лень возиться с масками, можете воспользоваться стандартными возможностями языка С
Вы правы -- лень, в дабавок я еще и не програмист (чайник ), поэтому спасибо за помощь.

caddr: На таком расстоянии нужен RS-485
В первоначальном варианте так и было, но пришлось отказаться в силу ряда причин... (Просто UART -- 0-5В).

 

Crazyd
Просто UART -- 0-5В
- Это из области -- создать себе кучу проблем, потом их героически преодолевать : - )
Даже стандартный RS-232, с уровнями +/-12В, и то далее 50 м практически не применим.

 

chav1961: передавать информацию дважды: первый байт - в нормальном виде, второй - в инверсном
Туплю, скорее всего, но не могу понять как при таком способе исправлять ошибки. Или только для их обнаружения?

 

Да, только для обнаружения. Впрочем, в каком именно бите произошла ошибка, здесь определить все-таки можно - достаточно выполнить "исключающее или" над этими байтами. Где вылез 0, там бит наврал. Правда, определить, каким именно способом он наврал, нельзя - для этого надо передавать не 2 байта, а хотя бы 3 (например, 2 прямых, один инверсный - и там уже прикидывать к носу ) Без обратной связи помехозащищенные протоколы не делаются - не нужно строить иллюзий Байт ведь может просто тупо не дойти... И никакой Хэмминг тут не спасет.

 

Именно так, я себе это и представлял.
Какой жутко неэффективный алгоритм, двойня избыточность и без коррекции. Для чего он используется, для скорости? ( в смысле считать не надо)

 

Да, команды в USB либо принимаются, либо не принимаются. Инверсия же гарантирует, что за команду не будет принята какая-нибудь бредятина из сплошных нулей (единиц). Блок данных там защищен по-человечески, т.е. контрольной суммой. Не мучайтесь, добавьте в протокол отправку байта подтверждения.

 

chav1961: Коды Хэмминга дают возможность восстановить один испорченный бит, во всех остальных случаях они только сигнализируют об ошибке - исправить ее нельзя.
Это - не так.
Код Хемминга может исправлять и большее число ошибок.
Всё зависит от количества дополнительных бит на слово.