Обмен данными и вопросы кодирования
Любые предложения люди понимают иначе, чем тот, кто их вносит.
Следствие:
Даже если ваше объяснение настолько ясно, что исключает всякое ложное толкование, все равно найдется человек, который поймет вас неправильно.
9.1. Соглашения о связи
При общении с формальными устройствами следует строго придерживаться принятых договоренностей - протоколов взаимодействия. Например, перед обращением к устройству надо проверить, что оно включено и не занято взаимодействием с другим партнером (с другой программой). Такое обычно возможно, если мы "тесно" связаны с устройством, живем в одном адресном пространстве, на одном компьютере.
Но это далеко не всегда так. Часто мы взаимодействуем с другим формальным партнером только через канал передачи данных. Да еще этот канал подвержен внешним воздействиям, которые могут исказить передаваемый сигнал. Тогда кроме соблюдения протокола важны еще и средства контроля приема/передачи данных.
Протокол подобного обмена обычно служит для посылки сообщения от одного источника к нескольким потребителям. Поэтому адрес (идентификационный код) источника включается в заголовок передаваемого блока данных. Для этой цели в начале передачи сообщения следует признак начала (STX), в который включают и идентификатор, и длину передаваемой последовательности.
Получив его, принимающая сторона может зарезервировать буфер необходимого размера для ввода сообщения, после чего отправляет приглашение к продолжению диалога (RTS). По окончании передачи источником данных посылается признак конца сообщения (ETX). В состав завершающей посылки обычно включается контрольная сумма. На переданное сообщение источником ожидается либо подтверждение (AK), либо указание на сбой в приеме данных (NAK). В последнем случае передача повторяется.
Любое принятое сообщение сначала контролируется на целостность, а уже потом расшифровывается (интерпретируется). Принимающая сторона может проверить и то, что отдельные элементы последовательности получены, и то, что все сообщение принято правильно (принятая контрольная сумма совпадает с рассчитанной по тексту сообщения).
При нарушении целостности партнеру обычно направляется просьба повторить посылку. Конечно, при большой "зашумленности" канала связи/передачи оба партнера будут все время переспрашивать друг друга, так и не произведя собственно обмен данными. Поэтому в сообщения стараются ввести такую избыточность, которая позволила бы в ряде случаев не только обнаружить искажение, но и исправить отдельные ошибки в принятом блоке данных.
9.2. Помехозащищенное кодирование
Первый уровень избыточности вводится на уровне передаваемых символов (8 бит), слов, размер которых может быть 16, 32, 64 бита в зависимости от "ширины" линии передачи данных. Например, для этого в состав символа, для кодирования которого используется 8 бит (256 возможных значений), добавляется дополнительный "контрольный" разряд. Этот избыточный бит не создает новых символов, но его значение устанавливается, например, так, чтобы сумма единиц в передаваемом коде была всегда четная.
Другими словами, складывая биты принятого символа по модулю два с учетом контрольного разряда, принимающая сторона должна всегда получать 0. При этом способе избыточного кодирования, передавая код 01001101, мы должны добавить контрольный разряд, равный 0, а для кода 11101100 контрольный разряд должен быть равным 1.
Такая система избыточного кодирования позволяет обнаружить неверно переданный символ, если в его коде произошла одна ошибка (пропуск - замена 1 на 0 или ложное срабатывание - замена 0 на 1).
Как правило, подобного контроля достаточно для фиксации ошибки при приеме. Далее можно запросить источник данных повторить неверно принятый символ. Однако в системах реального времени порой невозможно прервать прием. Связь устанавливается на большие расстояния, и у нас нет возможности ждать реакции приемника на каждый переданный символ.
Передающая сторона вынуждена непрерывно передавать пакет данных, надеясь, что ее верно поймут на стороне приема. В лучшем случае она может подождать реакции в конце передачи и повторить весь пакет заново. Часто бывает нужно не только обнаружить факт наличия ошибки в сообщении, но и постараться исправить его. Для одиночных ошибок для этого достаточно применить похожий прием добавления контрольного разряда и передать в конце сообщения контрольный байт (слово, значение контрольной суммы), разряды которого сформированы по тому же принципу, что и контрольный разряд символа.
Разряды: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | к.р. |
0 байт | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
1 байт | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
2 байт | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
3 байт | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
4 байт | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
Контр.байт | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
В табл. 9.1(а) приведен пример кодирования по указанной схеме сообщения из пяти байт, контрольный разряд каждого из которых формируется по ранее упомянутому алгоритму. Для контроля передачи к сообщению добавлен шестой контрольный байт, значащие разряды которого дополняют соответствующие разряды переданного сообщения до четного количества единиц (в колонках).
При одиночной ошибке (табл. 9.1(б)) четвертого бита в первом байте мы легко установим, что байт был принят неверно. Количество единичных разрядов в нем оказалось при приеме нечетным (семь). Но мы не знаем, какой разряд был искажен.
Разряды: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | к.р. |
0 байт | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
1 байт | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
2 байт | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
3 байт | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
4 байт | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
Контр.байт | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
Это может быть любой из информационных разрядов. А может, мы неверно приняли контрольный разряд байта? Выяснить это удастся только после приема контрольной суммы всего сообщения. Сам байт контрольной суммы дополнен контрольным разрядом и принят правильно (содержит шесть единиц). А при расчете контрольной суммы по колонкам (разрядам) сообщения мы поймем, что в четвертом разряде в контрольной сумме допущена ошибка.
Это позволяет установить, что при приеме первого байта сообщения четвертый разряд был искажен. Мы получили 1, а должны были получить 0.
Конечно, таким образом могут быть обнаружены и исправлены только единичные ошибки в сообщениях. Для более ненадежных линий связи приходится применять избыточные коды с более сложными алгоритмами обнаружения и устранения ошибок. Кроме того, надо помнить и соблюдать правила взаимодействия с партнерами, т.е. строго выполнять те соглашения о связи, которые оформляются в протоколах обмена.