Расчетно-пояснительная записка(V) (1061338), страница 2
Текст из файла (страница 2)
В данной работе используются следующие параметры передачи данных:
-
число информационных бит – 8;
-
количество стоповых бит – 1;
-
бит паритета (контроля четности) – не используется;
-
скорость обмена – 9600.
1.4. Реализация физического уровня.
1.4.1. Открытие порта.
В ОС Windows доступ к COM-портам предоставляется посредством файловых интерфейсов. Для открытия порта используется функция CreateFile. Эта функция предоставляется Win32 API.
При успешном открытии файла, в нашем случае порта, функция возвращает описатель (HANDLE) файла. При ошибке INVALID_HANDLE_VALUE. Код ошибки можно получить вызвав функцию GetLastError.
После открытия порта производится его сброс с помощью функции PurgeComm.
Вызов этой функции позволяет решить две задачи: очистить очереди приема/передачи в драйвере и завершить все находящиеся в ожидании запросы ввода/вывода.
Установка параметров (скорости передачи – BaudRate, количества информационных бит – ByteSize, количества стоповых бит – StopBits и использования бита паритета – fParity) производится с помощью функций GetCommState и SetCommState. Функция GetCommState возвращает текущие настройки параметров порта, а функция SetCommState устанавливает параметры после установки требуемых значений.
Далее производится настройка тайм-аутов чтения и записи порта с помощью функций GetCommTimeouts (возвращает текущие значения тайм-аутов) и SetCommTimeouts (устанавливает значения тайм-аутов). Тайм-ауты необходимы для правильной работы функций чтения из порта и записи в порт. В программе определяются следующие значения:
-
ReadIntervalTimeout – максимальное время, в миллисекундах, допустимое между двумя последовательными символами, считываемыми с коммуникационной линии. Во время операции чтения временной период начинает отсчитываться с момента приема первого символа. Если интервал между двумя последовательными символами превысит заданное значение, операция чтения завершается и все данные, накопленные в буфере, передаются в программу. Нулевое значение данного поля означает, что данный тайм-аут не используется. Значение MAXDWORD, вместе с нулевыми значениями полей ReadTotalTimeoutConstant и ReadTotalTimeoutMultiplier, означает немедленный возврат из операции чтения с передачей уже принятого символа, даже если ни одного символа не было получено из линии;
-
ReadTotalTimeoutMultiplier – задает множитель, в миллисекундах, используемый для вычисления общего тайм-аута операции чтения; для каждой операции чтения данное значение умножается на количество запрошенных для чтения символов;
-
ReadTotalTimeoutConstant – задает константу, в миллисекундах, используемую для вычисления общего тайм-аута операции чтения. Для каждой операции чтения данное значение прибавляется к результату умножения значения. Нулевое значение полей ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant означает, что общий тайм-аут для операции чтения не используется;
-
WriteTotalTimeoutMultiplier – задает множитель, в миллисекундах, используемый для вычисления общего тайм-аута операции записи; для каждой операции записи данное значение умножается на количество записываемых символов;
-
WriteTotalTimeoutConstant – задает константу, в миллисекундах, используемую для вычисления общего тайм-аута операции записи; для каждой операции записи данное значение прибавляется к результату умножения значения WriteTotalTimeoutMultiplier на количество записываемых символов. Нулевое значение полей WriteTotalTimeoutMultiplier и WriteTotalTimeoutConstant означает, что общий тайм-аут для операции записи не используется.
1.4.2. Закрытие порта.
Перед закрытием порта производится его сброс с помощью функции PurgeComm. Закрытие порта по его описателю осуществляется с помощью функции Win32 API CloseHandle. Функция имеет единственный параметр - описатель закрываемого объекта. При успешном завершении функция возвращает не нулевое значение, при ошибке нуль
1.4.3. Передача данных.
Передача данных выполняется функцией WriteFile. Эта функция возвращает управление тогда, когда все данные переданы или по истечении тайм-аута записи. При этом операционная система берет на себя все функции управления передачей массива байтов, переданных функции WriteFile.
1.4.4. Прием данных.
Перед считыванием символов с помощью функции ClearCommError анализируется состояние входного буфера: есть ли в нем символы для считывания. Если символы отсутствуют, то программа ждет заданный интервал времени (в программе задан интервал времени между проверками прихода символа 100 миллисекунд). Для задержки работы программы используется функция Sleep. Попытки считывания повторяются количество раз, заданных при вызове функции чтения из порта.
Считывание поступивших в порт символов выполняется функцией ReadFile. Если с момента вызова функции ReadFile в течение тайм-аута чтения во внутренний буфер не поступило ни одного байта, функция возвращает управление.
При ошибке чтения из порта или при истечении тайм-аута функция устанавливает соответствующее значение ошибки.
2. Канальный уровень.
2.1. Защита передаваемой информации.
При передаче данных по линиям, входящим в коммутируемую сеть, чаще всего возникают ошибки, обусловленные электрическими помехами. Эти помехи в свою очередь могут вызвать ошибки в цепочке или пакете последовательных битов.
Для обнаружения ошибок применяют разнообразные корректирующие коды. Например: линейный код, код Хемминга, циклический код, логический код 4B/5B.
Для практической реализации циклических кодов могут быть использованы схемы с регистрами сдвига и обратными связями, или таблицы (в программе используется полином X3+X+1).
В рамках данной курсовой работы необходима реализация алгоритма кодирования циклическим кодом.
Рассмотрим алгортим циклического кода:
-
Задана информационная последовательность m(x). Умножить заданный полином степени ( k-1) на х^(n-k), т.е. сдвинуть в сторону старших разрядов на (n--k); где
n = r+k , r - степень образующего полинома , k - число информационных разрядов данной последовательности;
2. Получить остаток от деления полинома x^(n-k)*m(x) на g(x) - образующий полином. Степень остатка <= n-k-1
3. Объединить остаток р(х) и исходный полином x^(n-k)*m(x) для получения кодового слова; p(x)@ x^(n-k)*m(x), где @ - конкатенация;
Декодирование циклического кода :
V(x) - передаваемый кодовый полином; r(x) - принятый;
r(x)=g(x)*q(x)+S(x), где q(x) - частное, S(x) - остаток от деления переданного полинома на порождающий полином;
S(x)=S0+S1*x+...+S(n-k-1)*x^(n-k-1) - синдром ошибки (если S(x) = 0, ошибки нет или она не обнаружена)
r(x)=V(x)+e(x), где e(x) - вектор ошибки;
e(x)=V(x)+q(x)*g(x)+S(x)=[ m(x)+q(x)]*g(x)+S(x)
Задача декодирующего устройства - оценка вектора g(x) по синдрому ошибки.
По значению синдрома ошибки определяется бит, в котором была обнаружена ошибка:
| Синдром | Номер бита |
| 001 | 0 |
| 010 | 1 |
| 100 | 2 |
| 011 | 3 |
| 110 | 4 |
| 111 | 5 |
| 101 | 6 |
Следует, однако, отметить, что такое кодирование защищает только в случае единичной ошибки. Исправление же ошибок может применяться лишь в случае стопроцентной уверенности в ее кратности. Поэтому в нашем случае при их обнаружении отбрасывается весь кадр, затем обе станции об этом оповещаются, и он посылается снова. Станция-приемник ведет счет поврежденным кадрам и в случае превышении лимита разрывает соединение.
2.2. Передача данных.
Работа сети с использованием данной программы построена по принципу «ведущий-ведомый». Станция, инициировавшая соединение, становится ведущей. Она может либо передать файл, либо запросить его у другой станции (ведомой).
Компьютер – передатчик (ведущая станция) после выбора пользователем файла для передачи передаёт компьютеру-приёмнику (ведомой) информационные кадры, содержащие имя файла и его длину (структуру кадра см. на листе «Структура протокольных блоков данных»). Компьютер – приёмник принимает эти кадры и компьютеру – передатчику отправляет положительную квитанцию на каждый из этих кадров. В случае ошибки передачи компьютер – приёмник передаёт компьютеру – передатчику отрицательную квитанцию и разрывает соединение, а компьютер – передатчик, не получив в течении установленного времени положительной квитанции или получив отрицательную квитанцию разрывает соединение.
В случае прихода двух положительных квитанций компьютер-передатчик начинает поблочную передачу файлов, дожидаясь прихода положительной квитанции после отсылки каждого блока. При приходе отрицательной квитанции при передаче любого блока, соединение разрывается. А компьютер-приёмник, не получая по истечении определённого времени блоков данных, тоже рвёт соединение.
После успешной передачи файлов соединение разрывается.
Если ведущая станция запрашивает файл, то сначала она передает ведомой кадры с его местонахождением. Если ведомая нашла файл, то она передает его длину. Далее начинается передача файла от ведомой к ведущей, как описано выше.
2.3. Форматы кадров.
Существуют 2 типа кадров:
Информационный кадр бывает 3-х типов:
1. Для передачи данных типа int
-
Идентификатор(01001110).
-
Данные типа int(4 байта).
2. Для передачи данных типа char
-
Идентификатор(01010011).
-
Длина блока данных в байтах(1 байт)
-
Данные типа char
3. Для передачи данных типа short int
-
Идентификатор(01001001).
-
Длина блока данных в байтах(1 байт)
-
Данные типа short int
Управляющий кадр состоит из одного поля и бывает 6-и типов:
-
Положительная квитанция (01010100)
-
Отрицательная квитанция (01000110)
-
Разрыв соединения (01000100)
-
Ведущая станция (01001101)
-
Ведущая станция отдает файл (01000111)
-
Ведущая станция запрашивает файл (01000001)
3. Пользовательский уровень.
3.1. Формы.
Главная форма:
На главной форме имеются следующие элементы:
-
Выбор ком порта. (Выбираем ком порт)
-
Окно чата.
-
Окно списка пользователей. (Доступные для передачи сообщений пользователи)
-
Строка чата. (Строка ввода, для передачи)
-
Кнопка Disconnect (разъединение соединения)
-
Кнопка Connect (установка соединения)
-
Кнопка Ready to Chat
-
Кнопка Send (передать сообщение)
-
Кнопка Exit (выход из программы)
11















