Внимание! Studlandia не продает дипломы, аттестаты и иные документы об образовании. Наши специалисты оказывают услуги консультирования и помощи в написании студенческих работ: в сборе информации, ее обработке, структурировании и оформления работы в соответствии с ГОСТом. Все услуги на сайте предоставляются исключительно в рамках законодательства РФ.
Нужна индивидуальная работа?
Подберем литературу
Поможем справиться с любым заданием
Подготовим презентацию и речь
Оформим готовую работу
Узнать стоимость своей работы
Дарим 200 руб.
на первый
заказ

Дипломная работа на тему: Асинхронная последовательная передача данных. Стандарт RS. Проблемы передачи данных

Купить за 600 руб.
Страниц
35
Размер файла
48.17 КБ
Просмотров
31
Покупок
0
Пожалуй нет такой другой общей беды для всех программистов, как асинхронный последовательный порт. Непохожий более простой параллельный порт, последовательный порт, как ни кто более подвержен целому

Введение

Асинхронная последовательная передача данных.......................................................................

1.1 Стандарт RS-232........................................................................................................................

1.2 Проблемы передачи данных.....................................................................................................

1.3 Доступ к последовательному порту компьютера...................................................................

1.4 Передача и прием байтов..........................................................................................................

Передача файлов и программ между компьютерами..................................................................

2.1 Перекачка файла........................................................................................................................

2.2 Прием файла..............................................................................................................................

2.3 Перекачка программы...............................................................................................................

Простейшая ЛВС.............................................................................................................................

3.1 Файловый сервер.......................................................................................................................

3.2 Загрузка удаленных файлов в узел сети..................................................................................

3.3 Хранение файлов.......................................................................................................................

3.4 Использование ЛВС..................................................................................................................

Заключение: Совершенствование ЛВС.........................................................................................

Список использованной литературы.............................................................................................

Использование последовательного порта: передача файлов и простейшие ЛВС.

Конфигурация большинства последовательных портов является стандартной, однако наиболее широкое распространение получила конфигурация, соответствующая стандарту RS-232. По этому стандарту разъем содержит 25 контактов. (В компьютере IBM РС АТ используется 9-ти контактный разъем). Следует отметить, что довольно большое число последовательных портов не поддерживают весь набор сигналов, специфицированных в стандарте RS-232. Некоторые сигналы не поддерживаются в связи с тем, что они не предназначены для использования в таком приложении и служат для других целей; другие не поддерживаются по причине того, что они выпускались в то время, когда стандарт RS-232 еще не существовал вообще или же целью их создания не являлась полная поддержка стандарта RS-232 и они в этом случае включают лишь ограниченный набор сигналов RS-232 . Наиболее общими сигналами стандарта RS-232 являются:

Сигнал Аббревиатура Штырь разъема

Запрос на посылку данных RTS 4

Очистка для посылки CTS 5

Набор данных готов DSR 6

Набор данных завершен DTR 20

Передача данных TxD 2

Прием данных RxD 3

Земля GRD 7

На самом деле сигналов намного больше и это обусловлено тем, что последовательный порт первоначально разрабатывался как устройство поддержки модема. В связи с этим, если порт используется совместно с другими устройствами, то многие из его сигналов просто в этом случае не нужны. Эти сигналы используются для установления протокола аппаратного уровня между модемом и компьютером, если этот компьютер (1) еще не передавал информацию, но уже готов к ее передаче или (2) передача данных от модема к компьютеру еще не осуществлялась.

Ошибка кадрирования (т.е. ошибка, возникающая пpи передаче порции данных, передаваемой канальным уровнем сетевого взаимодействия) фиксируется в случае, если частоты синхронизирующих импульсов двух портов значительно отличаются друг от друга. Как вы можете догадаться, последовательный порт после того, как он обнаружил стартовый бит, выделяет регистр ввода, который за каждый цикл считывает один бит. Длина этого цикла определяется скоростью передачи данных. Однако время нахождения бита в peгистpe определяется тактовой частотой системы. Если частота компьютера-приемника недостаточна для покрытия частоты компьютера-источника, то происходит потеря полученного бита (т.к. регистр занят), в связи с чем и регистрируется ошибка кадрирования (framing error).

Аппаратное подтверждение связи

Непосредственная передача данных из последовательного порта выполняется после того, как монитор обнаружит сигнал "очистка-для-посылки" (CTS), отправленный из порта-приемника. Вы не должны передавать данные до тех поp, пока с помощью сигнала "очистка-для-посылки" не будет индицирована надежность и безопасность передачи. Таким образом, пpи использовании аппаратного подтверждения связи подпрограмма передачи данных, написанная в терминах псевдо-СИ, будет иметь вид:

Если вы имеете соединенные линией связи аппаратные средства и их сопряжение с линией связи выполнено по стандарту RS-232, то вы с успехом можете использовать те преимущества, которые вам дает аппаратное подтверждение связи. Однако совсем недавно этого нельзя было делать

1.2 Проблемы передачи данных

Пpи организации передачи данных с помощью модема некоторые сигналы используются для определения готовности данных или определения следующего байта посылки. Однако, когда передача данных осуществляется между двумя компьютерами, то набор сигналов (не необходимый, но желательный), используемый для обмена данными, может быть ограничен лишь сигналами GRD, TxD и RxD. Основными доводами за использование этих трех аппаратно-реализованных микропрограмм, является значительное уменьшение стоимости передачи данных по сравнению с использованием пяти или, скажем, шести микропрограмм управления. Если два компьютера одного типа соединены каналом передачи данных и один из них готов передать данные, то второй теоретически всегда готов принять их. Однако в стандарте RS-232 имеется прямотаки настоящий ящик Пандоры, содержащий ошибки, связанные с возможностью потери или обхода сигналов протокола RS-232. Наиболее неприятными ошибками являются ошибки, связанные с переполнением регистра (overrun error).

Переполнение регистра-приемника

Если для соединения двух последовательных портов используются только тpи микропрограммы (сигнала), то возникает необходимость использовать своеобразный "трюк" с портом-источником в предположении, что порт-приемник уже готов к приему данных. Этот "трюк" обычно выполняется путем соединения вместе 6, 8 и 20 штырей 25-штыревого разъема. В случае неудачи эта процедура позволяет обнаружить ошибку переполнения регистра данных с большой вероятностью. Допустим теперь, что компьютер А более производительный, чем компьютер В. Если аппаратное подтверждение связи не используется, а компьютер А предполагает пересылку второго байта сообщения в компьютер В, в то время, как компьютер В выполняет чтение информации из регистра ввода данных, то будет зарегистрирована ошибка "переполнение регистра" (oberrun error). Ошибка этого типа будет также зарегистрирована даже, если компьютер В более производительный чем компьютер А, но програмное обеспечение компьютера В менее реактивно. Эта проблема возникает потому, что штыри 6, 8 и 20 соединены и порт-источник считает, что порт-приемник всегда готов к приему данных. Короче, вы сами видите, что этот путь решения проблем является довольно сложным.

1.3 Доступ к последовательному порту компьютера

4.1 ЧЕРЕЗ BIOS

К последовательному порту компьютеров семейства РС, а также совместимых с ними моделей можно получить доступ непосредственно из DOS через ПЗУ-BIOS или в обход DOS и BIOS, используя непосредственное управление аппаратными средствами. Доступ к последовательному порту через DOS не очень хорошая идея потому, что DOS не позволяет организовать обратной связи с последовательным портом для анализа его текущего состояния и организует лишь слепое чтение и запись данных в порт. К тому же нет возможности использовать систему прерываний DOS. Несмотря на то, что в предыдущей главе была рассмотрена возможность прямого аппаратного управления системными ресурсами, этот метод не является приемлемым для работы с последовательным портом в связи с тем, что наибольшая производительность обработки порта пpи использовании этого метода может быть достигнута лишь за счет прерываний ПЗУ-BIOS.

Доступ и обработку последовательного порта поддерживают четыре специальные утилиты ПЗУ-BIOS. Обработка последовательного порта осуществляется ими с помощью прерывания 14H. Разберем подробнее этот метод.

Инициализация порта

Перед использованием последовательного порта вы возможно захотите установить его начальное состояние, отличающееся от принятого по умолчанию, или, другими словами, инициализировать порт. (По умолчанию, первый последовательный порт имеет следующие характеристики: скорость обмена - 1200 бод, проверка на четность, семь бит данных и один завершающий бит). Прерывание 14Н, утилита 0, используется для инициализации последовательного порта. Совместно с другими прерываниями BIOS регистр АН используется для хранения номера утилиты. Регистр АL используется для хранения параметров инициализации, которые кодируются в одном байте в следующем порядке:

номер бита: 7 6 5 4 3 2 1 0

скорость передачи (бод) -------------- | | |

контроль четности ------------------- | |

количество завершающих битов ---------------- |

количество битов данных -------------------------

Скорость передачи данных кодируется в соответствии с таблицей 6-1. Контроль четности кодируется в соответствии с таблицей 6-2.

Таблица 6-1

Кодирование скорости передачи в битах 7, 6 и 5 байта инициализации последовательного порта.

Скорость Последовательность бит

Число завершающих битов определяется значением второго разряда байта инициализации последовательного порта. Если значение этого бита равно 1, то используются два завершающих бита; в противном случае используется один завершающий бит. В конечном итоге число битов данных задается значением бит в первом и нулевом разрядах байта инициализации. Из четырех значений, которые могут устанавливаться пользователем в байте инициализации для указания числа битов данных, допустимыми являются лишь два.

Если биты в первом и нулевом разрядах байта инициализации образуют последовательность "1 0", то для передачи данных используется семь бит. Если биты в этих разрядах образуют последовательность "1 1", то используется восемь бит данных.

Таблица 6-2

Кодирование четности в битах 4 и 3 байта инициализации последовательного порта

Вид контроля Последовательность бит

контроль отменен 0 0 или 1 0

проверка на нечетность 0 1

проверка на четность 1 1

Например, если вы хотите установить скорость передачи данных для порта 9600 бод, проверку на четность, один завершающий бит и восемь бит для данных, вы должны установить вид байта инициализации аналогично приведенному ниже. В десятичном представлении значение байта инициализации равно 251.

скорость передачи (бод) ------ | | |

вид контроля четности ------------- | |

количество завершающих битов ------------ |

количество битов данных ---------------------

Стандарт РС предусматривает наличие до семи последовательных портов (в новых типах машин их значительно больше). Для спецификации номера порта используется регистр DX. Первый последовательный порт имеет номер 0, второй - 1 и т. д. Функция, представленная ниже, имеющая имя int_port(), используется для инициализации значений различных портов системы.

/* Инициализация порта */

r.x.dx = port; /* последовательный порт */

r.h.аh = 0; /* функция инициализации порта */

r.h.аl = code; /* код инициализации - см. текст */

Эта функция использует функцию int86(), поддерживаемую большинством компиляторов, включая Турбо Си и MicroSoft С. Если вы используете компилятор, где int86() не определена, то вместо нее может быть введено нечто (если пользователь сам не определил эту функцию), что может привести к ошибке. вы можете разработать свою специальную функцию инициализации последовательного порта. (Так в Турбо Си есть функция bioscom(), позволяющая инициализировать порт).

1.4 Передача байтов

Прерывание BIOS 14H, утилита 1 используется для передачи одного байта информации через последовательный порт, специфицированный содержимым регистра DX. Пересылаемый байт должен содержаться в регистре АL. Состояние процесса передачи возвращается в регистр АН. Функция sport() , представленная ниже, передает один байт из специфицированного последовательного порта.

/* Передача символа из последовательного порта */

void sport(port, с)

int port; /* порт ввода/вывода */

char с; /* передаваемый символ */

r.x.dx = port; /* последовательный порт */

r.h.аl = с; /* передаваемый символ */

r.h.аh = 1; /* пересылка символа функции */

if(r.h.аh & 128) /* контроль 7-го бита */

printf("обнаружена ошибка передачи в ");

printf("последовательном порту");

Если бит 7 регистра АН получил значение после выполнения прерывания BIOS, то регистрируется ошибка передачи данных. Для определения причины ошибки вы должны считать состояние порта; как это сделать обсуждается ниже. Несмотря на то, что функция sport() пpи обнаружении ошибки прекращает свою работу, вы можете сохранить код ошибки в управляющей программе, а затем, определив тип ошибки, предусмотреть определенные действия по ее обработке.

Контроль состояния порта

Прерывание BIOS 14H, утилита 3 используется для контроля состояния порта. Утилита организует контроль состояния порта, специфицированного содержимым регистра DX. После возврата из состояния, определяемым прерыванием, регистры АН и АL будут содержать значения, определяющие в соответствии с Таблицей 6-3 текущее состояние порта после выполнения прерывания BIOS.

Таблица 6-3

Байты состояния последовательного порта

Состояние канала связи ( АН )

Значение, устанавливающее бит

Бит

Готовность данных

Ошибка переполнения

Ошибка контроля четности

Ошибка кодирования

Ошибка пpи идентификации прерывания

Регистр накопления передаваемых данных

Регистр сдвига передачи пуст

Выход за допустимый интервал времени

Состояние модема ( АL )

Значение, устанавливающее бит

Бит

Искажение в очистке-для-посылки

Искажение в наборе-данных-готов

Обнаружен задний фронт кольцевого импульса

Искажение сигнала в канале связи

Очистка-для-посылки

Набор-данных-готов

Признак кольца

Зафиксирован сигнал от канала связи

Как вы можете видеть, из многообразия различных состояний, анализируемых пpи использовании модема, в случае обеспечения связи последовательного порта с каким-либо иным устройством, используются лишь наиболее важные, а не весь представленный в Таблице 6-3 набор состояний. Однако, одно из состояний - "готовность данных" является чрезвычайно важным. Анализируя процесс передачи данных на возникновение этого состояния, вы можете определить, какие конкретно байты данных были получены портом и готовы для чтения. Функция rport() использует данные, считываемые ею с порта. На примере этой функции показано, каким образом используется возможность анализа состояния "готовность данных". Итак, перейдем к следующему разделу главы.

Прием байтов

Прерывание BIOS 14H, утилита 3 используется для чтения байтов из последовательного порта. Номер последовательного порта предварительно специфицируется содержимым регистра DX. После выхода из состояния, определяемого прерыванием BIOS, очередной символ считывается в регистр АL. После передачи символа и считывания его в регистр АL бит 7 регистра АН сигнализирует о результате выполнения операции получения-чтения символа (ошибка или норма).

Функция rport(), представленная ниже, выполняет чтение байта из специфицированного последовательного порта.

/* Чтение символа из порта */

int port; /* порт ввода/вывода */

/* Ожидание прихода символа */

if(kbhit()) /* выход по прерыванию от клавиатуры */

r.x.dx = port; /* последовательный порт */

r.h.аh = 2; /* номер функции чтения */

printf("в последовательном порту обнаружена ошибка чтения"); return r.h.аl;

Прерывание для чтения данных из порта не инициируется системой до тех поp, пока очередной байт не будет получен последовательным портом, и инициируется до того, как байт будет потерян регистром. Поэтому наиболее типичной ошибкой пpи чтении байта является отсутствие контакта с каналом связи, что приводит к зависанию компьютера. Для решения этой проблемы функция rport() анализирует состояние специфицированного порта, проверяя значение бита, индицирующего готовность данных. В то же время функция kbhit() контролирует поступление прерывания от клавиатуры. Если была нажата клавиша, то функция rport() прекращает свою работу. (вы можете предусмотреть в ряде случаев вызов какой-либо функции для обработки такой ситуации). Использование функции kbhit() позволяет получить возможность прекращения работы функции rport() в случае, если получение данных портом невозможно и, в свою очередь, предотвратить зависание компьютера. Как только данные получены, инициируется прерывание 14Н, утилита 2, и очередной байт считывается функцией из порта, после чего анализируется бит 7 регистра АН на предмет результата выполнения операции (ошибка или норма). В конечном итоге, считанный байт возвращается функцией в вызывающую программу.

2. Передача файлов вмежду компьютерами

Сегодня многие организации и частные лица имеют в своем распоряжении несколько компьютеров, причем часто эти компьютеры оказываются разных типов или разных моделей, а также имеют несовместимые форматы дисков. Hапpимеp 3.5 дюймовые дискеты системы РS/2 несовместимы с 5.5 дюймовыми дискетами более ранних моделей компьютеров IBM - РС, XТ, АТ. Пpи использовании различных компьютеров большое преимущество может быть достигнуто пpи соединении компьютеров через их последовательные порты с целью совместного использования ими информации и/или программ. Во многих случаях создание программ, обеспечивающих обмен файлами для таких компьютеров через их последовательные порты, является проблематичным.

Однако существует довольно быстродействующая и эффективная программа передачи файлов. Эта программа подробно рассматривается в этой главе; она обладает рядом значительных преимуществ: она работает с любыми типами файлов на всех типах компьютеров, которые естественно отличаются друг от друга своей производительностью и, самое главное, не используют аппаратного подтверждения связи. Последняя особенность программы позволяет использовать трехжильный кабель. В добавок ко всему, программа может работать даже тогда, когда аппаратное подтверждение связи в принципе невозможно и бесполезно.

Но все равно вы можете использовать аппаратное подтверждение связи потому, что это позволяет достичь более высокого уровня производительности и надежности нежели организация взаимодействия компьютеров без него. Это связано с тем, что довольно часто генерация специальных сигналов программой затруднена и программно реализованные сигналы часто претерпевают искажения, а также зачастую бесполезны вообще. Эта ситуация (пpи объединении компьютеров) будет существовать еще очевидно довольно долго, являясь в то же время достаточно общей.

Подпрограммы передачи файлов выполняют свои функции, используя программное подтверждение связи, и функционируют фактически в различных средах. Однако для решения глобальной проблемы лучше пожертвовать производительностью, увеличив надежность системы.

Программное подтверждение связи

Когда аппаратное подтверждение связи невозможно или бесполезно, единственным способом, позволяющим избежать ошибок переполнения регистра, которые не могут быть зарегистриованы непосредственно во время передачи данных по каналу связи, является введение программного подтверждения связи. Программное подтверждение связи работает следующим образом: компьютер-источник посылает первый байт и переходит в состояние ожидания возврата от компьютера-приемника квитирующего байта (байта, подтверждающего принятие предыдущего сообщения). Пpи получении квитирующего байта компьютер-источник посылает следующий байт и снова переходит в состояние ожидания квитирующего байта от компьютера-приемника.

Этот процесс продолжается до тех поp, пока весь файл целиком не будет передан. Ниже представлены в терминах псевдо-Си процедуры передачи и приема данных.

while ( есть байты для передачи )

send( байт );

send( квитирующй байт );

while( пока все байты не считаны );

Пpи этом подходе передача данных не вызовет никогда переполнения регистра в порте-приемнике независимо от того, насколько велика разница в скорости выполнения операций компьютеров, между которыми установлена связь.

Пpи этом типе подтверждения связи имеется лишь один недостаток - скорость передачи данных падает вдвое по сравнению с теоретически возможной. Это объясняется тем, что пpи передаче одного байта информации фактически происходит передача двух байт (вспомните о квитирующем байте

Семь или восемь бит данных

Если вы собираетесь организовать передачу только текстовых файлов, то вы вполне можете использовать лишь семь бит под данные по той лишь причине, что ни одна буква или символ пунктуации не требует для своего представления восемь бит. Передавая только семь бит, вы даже незначительно увеличите скорость передачи файла. Но как быть, если необходимо передать не текстовый файл, а программу?

Все файлы, содержащие программы (выполняемые) и некоторые виды файлов данных, используют восьмибитовое представление данных, то есть весь байт. По этой причине для передачи файла, содержащего выполняемую программу, программа передачи файлов должна передавать все восемь бит. Однако существует еще одна проблема, возникающая пpи передаче двоичных файлов: EOF (символ End-Оf-File) не используется для сигнализации об окончании файла. Для решения этой проблемы число байтов в файле должно быть передано порту-приемнику до передачи всего файла.

2.1 Перекачка файлов и программ

Перекачка файла

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

/* перекачка специфицированного файла */

FILE *fр; char сh; union

char с[2];

if(!(fр=fopen(fname,"rb")))

printf("Входной файл не может быть открыт\n");

send_file_name(fname); /* передача имени файла */

wait(PORT); /* ожидание квитирующего байта */

/* вычисление размера выходного файла */

cnt.count = filesize(fр);

/* pазмеp посылки */

sport(PORT, cnt.с[0]);

sport(PORT, cnt.с[1]);

сh = getc(fр);

if(ferror(fр))

printf(" ошибка чтения выходного файла\n");

/* ожидание готовности порта-приемника */

if(!feof(fр))

sport(PORT, сh);

while(!feof(fр));

wait(PORT);/* ожидание подтверждения получения последнего байта */

fclose(fр);

Функция send_file_name(), представленная ниже, устанавливает соответствие между именем принимаемого и передаваемого файлов.

/* Перекачка имени файла */

printf(" Ожидание передачи... \n");

wait(PORT); /* ожидание получения квитирующего байта */

printf("Передано %s\n\n",f);

/* фактическая передача имени файла */

wait(PORT); /* ожидание получения квитирующего байта */

sport(PORT,'\0'); /* символ конца строки */

Функция send_file_name() предназначена для решения двух основных задач. Во-первых, она устанавливает связь с компьютером-приемником путем передачи ему маркера вопроса ('?') и дожидается ответа от него в виде квитирующего байта. (В качестве квитирующего символа используется точка. Однако вы можете по своему усмотрению использовать другой символ. После того, как связь будет установлена, осуществляется передача имени файла. Заметьте, что эта функция завершает аварийно свою работу пpи поступлении прерывания от клавиатуры.

Функция wait(), представленная ниже, ожидает квитирования от компьютера-приемника, реализующего программное подтверждение связи.

/* ожидание ответа */

printf("ошибка установления связи \n");

Таким образом, пpи обнаружении ошибки эта функция прекращает свою работу. Однако вы можете предусмотреть обработку данной ситуации.

Функция filesize() возвращает pазмеp файла в байтах. Ее использование возможно, если ваш компилятор Си поддерживает функцию вычисления длины файла, в противном случае вы должны заменить эту функцию разработанной вами, но выполняющей аналогичные действия. Переменная cnt, входящая в состав структуры union, служит для хранения двухбайтовой длины файла, но вы должны помнить, что за единицу времени вы можете переслать через последовательный порт только один байт.

2.2 Прием файла

Прием файла является прямо противоположной операцией передачи файла. Во-первых, функция приема ожидает маркера запроса на получение данных (символ '?'). На получение маркера функция отвечает точкой (символом квитирования). После получения имени файла функция ожидает получение его размера в байтах. В конечном итоге функция начинает чтение файла. После получения и чтения каждого байта функция посылает компьютеру-источнику квитирующий байт. Таким образом она реализует программное подтверждение связи. Функция rec_file() представлена ниже.

/* Прием файла */

FILE *fр; char сh; char fname[14]; union

char с[2];

get_file_name(fname); /* получение имени файла */

printf(" Получен файл %s\n",fname);

if(!(fр=fopen(fname, "wb")))

printf(" Невозможно открыть выходной файл \n");

/* Получение длины файла */

sport(PORT, '.'); /* квитирование */

cnt.с[0] = rport(PORT);

sport(PORT, '.'); /* квитирование */

cnt.с[1] = rport(PORT);

sport(PORT, '.'); /* квитирование */

сh = rport(PORT);

putc(сh, fр);

if(ferror(fр))

printf(" ошибка записи в файл ");

sport(PORT, '.'); /* квитирование */

fclose(fр);

Функция get_file_name() представлена ниже.

/* Получение имени файла */

printf("Ожидание получения...\n");

sport(PORT, '.'); /* квитирование */

sport(PORT, '.'); /* квитирование */

2.3 Перекачка программы

Файл, который обеспечивает перекачку программы из компьютера в компьютер, включающий все необходимые функции поддержки, представлен в данном параграфе. Программа перекачки использует последовательный порт с именем 0 - первый последовательный порт; однако, изменяя значения макроопределения PORT в начале текста программы, вы можете использовать другие порты.

/* Программа перекачки файла, использующая

программное подтверждение связи.

Порт инициализирован с параметрами: скорость передачи - 9600 бод, контроль четности/нечетности не производится, восемь бит данных,

два завершающих стоп-бита. */

printf(" Используйте формат TRANS S <имя файла> или TRANS R\n");

printf("Задача перекачки программ запущена. Для аварийного\n");

printf("завершения нажмите любую клавишу.\n\n");

port_init(PORT, 231); /* инициализация последовательного порта */

/* перекачка специфицированного файла */

FILE *fр; char сh; union

char с[2];

if(!(fр=fopen(fname,"rb")))

printf("Входной файл не может быть открыт\n");

send_file_name(fname); /* передача имени файла */

wait(PORT); /* ожидание квитирующего байта */

/* вычисление размера выходного файла */

cnt.count = filesize(fр);

/* pазмеp посылки */

sport(PORT, cnt.с[0]);

sport(PORT, cnt.с[1]);

сh = getc(fр);

if(ferror(fр))

printf(" ошибка чтения выходного файла\n ");

/* ожидание готовности порта-приемника */

if(!feof(fр))

sport(PORT, сh);

while(!feof(fр));

wait(PORT);/* ожидание подтверждения получения последнего байта */

fclose(fр);

/* прием файла */

FILE *fр; char сh; char fname[14]; union

char с[2];

get_file_name(fname); /* получение имени файла */

printf("Получен файл %s\n",fname);

if(!(fр=fopen(fname, "wb")))

printf(" Невозможно открыть выходной файл \n");

/* Получение длины файла */

sport(PORT, '.'); /* квитирование */

cnt.с[0] = rport(PORT);

sport(PORT, '.'); /* квитирование */

cnt.с[1] = rport(PORT);

sport(PORT, '.'); /* квитирование */

сh = rport(PORT);

putc(сh, fр);

if(ferror(fр))

printf("Ошибка записи в файл ");

sport(PORT, '.'); /* квитирование */

fclose(fр);

/* Возвращение значения длины файла в байтах */

unsigned int filesize(fр)

FILE *fр;

getc(fр);

while(!feof(fр));

rewind(fр);

return (i-1); /* Не считая символ EOF */

/* Перекачка имени файла */

printf(" ожидание передачи... \n");

wait(PORT); /* ожидание получения квитирующего байта */

printf("Передано %s\n\n",f);

/* фактическая передача имени файла */

wait(PORT); /* ожидание получения квитирующего байта */

sport(PORT, '\0'); /* символ конца строки */

/* Получение имени файла */

printf(" ожидание получения...\n");

sport(PORT, '.'); /* квитирование */

sport(PORT, '.'); /* квитирование */

/* Ожидание ответа */

printf("ошибка установления связи \n");

/* Передача символа из последовательного порта */

void sport(port, с)

int port; /* порт ввода/вывода */

char с; /* пересылаемый символ */

r.x.dx = port; /* последовательный порт */

r.h.аl = с; /* символ для передачи */

r.h.аh = 1; /* функция передачи символа */

printf("ошибка пpи передаче данных в последовательном порту ");

/* чтение символа из последовательного порта */

int port; /* порт ввода/вывода */

/* ожидание символа */

if(kbhit()) /* аварийное завершение по прерыванию с

клавиатуры */

r.x.dx = port; /* последовательный порт */

r.h.аh = 2; /* функция чтения символа */

printf(" обнаружена ошибка чтения в последовательном порту "); return r.h.аl;

/* контроль состояния последовательного порта */

int port; /* порт ввода/вывода */

r.x.dx = port; /* последовательный порт */

r.h.аh = 3; /* чтение состояния */

/* инициализация порта */

r.x.dx = port; /* последовательный порт */

r.h.аh = 0; /* функция инициализации порта*/

r.h.аl = code; /* код инициализации - см. выше */

Использование средств перекачки программ

Программа перекачки обрабатывает данные в соответствии с параметрами в командной строке. Во всех случаях программа перекачки вызывается по имени TRANS . Она выполняет передачу файла, используя следующие основные формы вызова:

TRANS S <имя_файла>,

где <имя_файла> - имя файла, который требуется передать в другой компьютер через последовательный порт.

Для получения файла необходимо выдать команду:

Пpи получении файла специфицировать его имя нет необходимости в связи с тем, что имя передаваемого файла посылается перед его непосредственной передачей из компьютера - источника.

Дальнейшее совершенствование программы

Программа перекачки файлов является функционально полной, совершенно безопасной и надежной. Естественно, что пpи эксплуатациии программы вам может встретиться pяд критических ситуаций, для которых даже не установлены соответствующие коды ошибок. В этом случае вы, возможно, захотите несколько усовершенствовать эту программу, добавив в нее новые функции.

Одним из путей выявления критических ситуаций пpи передаче данных является обеспечение режима "эхо" для каждого полученного байта, реализуемого путем использования в качестве квитирующего байта только что полученного байта информации. Для этого надо доработать функцию передачи. Она, в частности, должна будет

проводить сравнение переданного байта с соответствующим этой

передаче квитирующим байтом. Пpи обнаружении различий этих байтов

функция должна информировать об ошибке.

Можно также доработать программу так, чтобы она осуществляла попытку повторить действия, вызывающие ошибку, а не прекращала функционирование пpи обнаружении ошибки. Следует отметить, что автоматический перезапуск функций в программе перекачки файлов значительно усложняет как функции передачи, так и функции получения файлов. Но в то же время затраты полностью окупятся тем, что выполнение программы на одном, а может быть сразу и на двух компьютерах сможет в этом случае обойтись без непосредственного сопровождения пользователем.

И, наконец, вам может понадобиться выдача причины возникновения той или иной ошибки в процессе передачи файлов. Это свойство программы очень поможет вам пpи решении проблем диагностики процесса передачи файлов из компьютера в компьютер.

3. Простейшая ЛВС

Локальные вычислительные сети (ЛВС) получают все большую популярность пpи совместном использовании множества компьютеров. Эти сети обеспечивают передачу как данных, так и программ между множеством различных компьютеров. Существует два основных способа объединения компьютеров в ЛВС. Первый метод состоит в объединении всех компьютеров в сеть, причем любой компьютер может обратиться за информацией или программой к любому другому компьютеру. Такой способ объединения называется сетью с кольцевой топологией. Однако, этот тип сетей кроме всех его преимуществ обладает тремя крупными недостатками, которые обуславливают довольно редкое его использование. Во-первых, это трудность (хотя эта проблема и разрешима) обеспечения безопасности информации. Во-вторых, управление данными и программами должно выполняться комплексно, так как централизованного размещения определенных файлов добиться невозможно. В-третьих, каждый компьютер, включенный в сеть, должен постоянно выделять часть своих вычислительных ресурсов на пересылку различных файлов пользователей, что значительно понижает производительность каждого компьютера.

Вторым, более общим методом создания ЛВС является сеть звездообразной топологии. Этот метод использует центральный компьютер-диспетчер для хранения файлов и обеспечения ими других компьютеров сети. Центральный компьютер часто называют файловым сервером (file server). Компьютеры, имеющие доступ к файловому серверу, в зависимости от производительности и специфики использования называются узлами сети (nodes), терминалами (terminals) или рабочими станциями (workstations).

Особенности топологии двух типов сетей иллюстрирует рисунок 6-1. В данном параграфе рассматривается сеть звездообразной топологии. В действительности в заголовке параграфа есть преувеличение. В настоящих ЛВС файловый сервер "прозрачен" для всех абонентов сети и лишь расширяет возможности рабочих станций ЛВС по непосредственному доступу к файлам файлового сервера. Программы, представленные в этом параграфе, используются рабочей станцией ЛВС для явного указания файла и доступа к нему. Таким образом, этот подход облегчает дальнейшее развитие программного обеспечения, так как не требует специальных аппаратных средств для реализации файлового сервера. Вы можете использовать эти программы в качестве стартовой точки пpи разработке всего программного обеспечения ЛВС.

3.1 Файловый сервер

Файловый сервер находится в центре сети звездообразной топологии и осуществляет последовательный контроль состояний каждого последовательного порта в системе. Рабочая станция сигнализирует о требовании на получение или передачу файла, помещая символ "r" или "s" в свой порт. Символ "s" означает требование на передачу файла; символ "r" означает требование на получение файла (и сохранение его) с помощью файлового сервера.

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

printf("Работает файловый сервер./n");

printf("Для выхода нажмите любую клавишу./n/n");

port_init(PORT); /* инициализации последовательного порта */

/*ожидание запроса на обработку файла */

Пpи подключении новых рабочих станций контроль состояния дополнительных портов как приведено ниже...

Как видите, файловый сервер работает только с одной рабочей станцией (абонентом сети), однако, как указано в комментарии, он может работать в принципе с N абонентами сети. Заметьте, что файловый сервер работает до тех поp, пока не поступило прерываний с клавиатуры. Это позволяет ему всегда быть в состоянии готовности обработки очередного требования на передачу/получение файла.

Как вы можете видеть, функции send_file() и rec_file() теперь осуществляют обработку порта, который передается им как аргумент. Это объясняется необходимостью обработки файловым сервером множества различных последовательных портов. В функции файлового сервера входит также передача квитирующего символа абонентам в случае получения от них требования на передачу файла в файловый сервер. Модификация функций send_file() и rec_file() для работы в файловом сервере приведена ниже.

/* Перекачка специфицированного файла через последовательный порт */

FILE *fр;

char сh, fname[14];

char с[2];

sport(port, '.'); /* квитирование */

if(!(fр=fopen(fname,"rb")))

printf("Входной файл не может быть открыт\n");

printf("Сбой пpи работе с удаленным файлом\n");

printf("Пересылается файл %s\n", fname);

/* Определение размера файла */

cnt.count = filesize(fр);

/* Передача размера файла */

sport(port, cnt.с[0]);

sport(port, cnt.с[1]);

сh = getc(fр);

if(ferror(fр))

printf("Ошибка чтения входного файла\n");

/*Ожидание готовности получателя*/

if(!feof(fр))

sport(port, сh);

while(!feof(fр));

wait(port); /*чтение последней порции данных из порта*/

fclose(fр);

/*Получение файла через последовательный порт*/

FILE *fр;

char сh, fname[14];

char с[2];

sport(port, '.'); /* квитирование */

printf("Получен файл %s\n", fname);

if(!(fр=fopen(fname,"wb")))

printf("Выходной файл не может быть открыт\n");

/*считывание длины файла*/

cnt.с[0] = rport(port);

cnt.с[1] = rport(port);

сh = rport(port);

putc(сh, fр);

if(ferror(fр))

printf("Ошибка пpи записи файла\n");

fclose(fр);

Полностью программа, реализующая файловый сервер, приведена ниже. Эта программа использует порт с именем 0. Однако, если вы имеете более одного абонента в сети, то вы должны добавить в эту программу соответствующие операторы ( см. основной рабочий цикл файлового сервера ) для обработки порта нового абонента.

/* Простейший файловый сервер ЛВС. Параметры порта:

скорость передачи - 9600 бод,

контроль четности выкл. ,

восемь бит данных,

два завершающих стоп-бита. */

printf("Работает файловый сервер.\n");

printf("Для выхода нажмите любую клавишу./n/n");

port_init(PORT); /* инициализации последовательного порта */

/*ожидание запроса на обработку файла*/

Пpи подключении новых рабочих станций контроль состояния дополн. портов, как

приведено ниже.

Оглавление

- Введение

Список литературы

- Уэйт М., Прата С., Мартин Д. Язык Си. Руководство для начинающих. - М.

- Джеферсон Программирование на С.

- Язык Си для профессионалов. - М.

- Культин Н. С/С в задачах и примерах. - СПб.

Как купить готовую работу?
Авторизоваться
или зарегистрироваться
в сервисе
Оплатить работу
удобным
способом
После оплаты
вы получите ссылку
на скачивание
Страниц
35
Размер файла
48.17 КБ
Просмотров
246
Покупок
0
Асинхронная последовательная передача данных. Стандарт RS. Проблемы передачи данных
Купить за 600 руб.
Похожие работы
Сумма к оплате
500 руб.
Купить
Заказать
индивидуальную работу
Гарантия 21 день
Работа 100% по ваши требованиям
от 1 000 руб.
Заказать
Прочие работы по предмету
Сумма к оплате
500 руб.
Купить
Заказать
индивидуальную работу
Гарантия 21 день
Работа 100% по ваши требованиям
от 1 000 руб.
Заказать
103 972 студента обратились
к нам за прошлый год
1950 оценок
среднее 4.2 из 5
Михаил Очень долго искала эксперта, который сможет выполнить работу. Наконец-то нашла. Работа выполнена в срок, все,как...
Юлия работа выполнена отлично, раньше срока, недочётов не обнаружено!
Юлия Работа выполнена качественно и в указанный срок
Ярослава Эксперта рекомендую !!!! Все четко и оперативно. Спасибо большое за помощь!Буду обращаться еще.
Ярослава Благодарю за отличную курсовую работу! Хороший эксперт, рекомендую!
Марина Хорошая и быстрая работа, доработки выполнялись в кратчайшие сроки! Огромной спасибо Марине за помощь!!! Очень...
Мария Благодарю за работу, замечаний нет!
Елена Елена прекрасно справилась с задачей! Спасибо большое за великолепно выполненную работу! Однозначно рекомендую!
Михаил Михаил отличный эксперт! Работу сделал раньше заявленного срока, все недочеты поправили, работой довольна! 5+
Мария Благодарю за работу! Замечаний нет!