Пример: Глобальная сеть INTERNET
Я ищу:
На главную  |  Добавить в избранное  

Главная/

Программирование, базы данных. /

Сопряжение факсимильного аппарата с IBM PC

←предыдущая следующая→
... 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 

ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДґ

   ія2 я0   я2СОСТОЯНИЕ КАНАЛА СВЯЗИя0 ( регистр AH )          і

   ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДґ

   і готовность данных                         і   0   і

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

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

   і ошибка кодирования                        і   3   і

   і ошибка при идентификации прерывания       і   4   і

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

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

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

   ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДґ

   ія2  СОСТОЯНИЕ МОДЕМАя0  (регистр AL)                   і

   ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДґ

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

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

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

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

   і очистка для посылки                       і   4   і

   і набор данных готов                        і   5   і

   і признак кольца                            і   6   і

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

   АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДЩ

     Из перечисленных выше состояний не все используются.Одно

из  самых  важных состояний - " готовность данных" Анализируя

процесс передачи данных на возникновение этого состояния,мож-

но определить,какие конкретно байты данных были получены пор-

том и готовы для  чтения.Функция  rport(),описанная  ниже,ис-

пользует данные,считанные ею с порта.

 rport(int port) /* чтение символа с порта port порт в/в **/

 {

  union REGS r;

  while(!check_stat(PORT)&256)/* ожидание прихода символа */

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

   {

      getch();

      exit(1);

    }

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

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

    int86(0x14,&r,&r);

    if(r.h.ah & 128)

    printf(" в последовательном порту обнаружена ошибка\n");

    return (r.h.al);

  }

     Прерывание BIOS 14H,утилита 3  используется  для  чтения

байтов  из  последовательного  порта.Номер  последовательного

предварительно специфицируется содержимым  регистра  DX.После

выхода  из состояния,определяемого прерыванием BIOS,очередной

символ считывается в регистр AL.После передачи символа и счи-

тывания  его  в  регистр AL бит 7 регистра AH сигнализирует о

результате  выполнения  операции   получения-чтения   символа


                           - 34 -

(ошибка или норма).Функция rport(),представленная выше выпол-

няет чтение специализированного  байта  из  последовательного

порта.Прерывание  для  чтения данных инициируется системой до

тех пор,пока очередной не будет получен последовательным пор-

том,и  инициируется  до  того,как  байт будет потерян регист-

ром.Поэтому наиболее типичной ошибкой при чтении байта  явля-

ется отсутствие контакта с каналом связи,что приводит к зави-

санию компьютера.Для решения этой  проблемы  функция  rport()

анализирует состояние порта,проверяя значение бита,индицирую-

щего готовность данных.В тоже время функция kbhit() контроли-

рует  поступление прерывания с клавиатуры.Если нажата клавиша

то функция прекращает свою работу.Использование kbhit()  поз-

воляет получить возможность прекращения работы rport() в слу-

чае,если получение данных портом  невозможно  и,в  свою  оче-

редь,предотвратить зависание компьютера.Как только данные по-

лучены,  инициируется прерывание 14H,утилита  2  и  очередной

байт  считывается  функцией из порта,после чего анализируется

бит 7 регистра АН на предмет результата выполнения операции.

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

бесполезно,единственным способом,позволяющим избежать  ошибок

переполнения  регистра,которые не могут быть зарегистрированы

непосредственно во время передачи данных по каналу  связи,яв-

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

подтверждение связи работает таким образом : компьютер-источ-

ник  посылает  первый  байт  и переходит в состояние ожидания

возврата квитирующего байта.При получении квитирующего  байта

компьютер  источник посылает следующий байт и снова переходит

в состояние ожидания квитирующего байта от компьютера -  при-

емника.

     Этот процесс продолжается до тех пор,пока весь файл  це-

ликом не будет передан.Ниже представлена процедура передачи и

приема данных :

   send()

    {

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

     {  send(байт);   wait(); }

    }

     receivite()

      {

    do {

         receive_byte();

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

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

      }

     При этом  подходе передача данных не вызовет никогда пе-

реполнения регистра в порте - приемнике не  зависимо  от  то-

го,насколько  велика  разница  в скорости выполнения операций

компьютеров,между которыми установлена связь,но имеется  один

недостаток  - скорость передачи данных падает в двое по срав-

нению с теоретически воэможной.

     Если нужно  организовать  передачу только текстовых фай-

лов,то можно использовать только семь бит под данные  по  той

причине,что  ни  одна  буква или символ пунктуации не требует

для своего представления восемь бит.Передавая семь бит  можно

немного выиграть в скорости.

     Для передачи остальных файлов используют восемь  бит.Од-


                           - 35 -

нако  существует  другая  проблема:EOF  (End Of File - символ

конца файла ) не используется для сигнализации окончания фай-

ла.Для решение этой проблемы число байтов в файле должно быть

передано порту-приемнику до передачи всего файла.

     Первой необходимой   нам  подпрограммой  является  функ-

ция,обеспечивающая  передачу  файла  через   последовательный

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

ния,подсчитать его длину,передать в порт приемник  его  длину

передаваемого  файла и передать его.Ниже представлена функция

send_file(),предназначенная для этого.

 void send_file(char *fname)

  {

   FILE *fp;

   char ch;

   struct stat statbuf;

   struct

     {

    char c[2];

    unsigned int count;

     }     cnt;

    if ((fp = fopen(fname,"rb") == NULL )

     { printf ("Ошибка открытия файла %s\n",fp);

       exit(1);

     }

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

      stat(fname,&statbuf);

      wait(PORT);   /********

←предыдущая следующая→
... 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 


Copyright © 2005—2007 «RefStore.Ru»