←предыдущая следующая→
... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/******** ожидание квитирующего байта **/
cnt.count = statbuf.st_size /******** размер файла **/
sport(PORT,cnt.c[0]); /** передача символа из порта **/
wait(PORT);
sport(PORT,cnt.c[1]);
do {
ch = getch(fp);
if(ferror(fp));
{
printf("Ошибка чтения выходного файла \n");
break;
}
if(!feof(fp))
{
wait(PORT);
sport(PORT,ch);
}
} while(!feof(fp));
wait(PORT);
fclose(fp);
} /******************************* конец send_file ***/
Функция stat(),используемая в send_file() описана в Bor-
land C++.
Функция send_file_name(),представленная ниже,устанавли-
вает соответствие между именем принимаемого и передаваемого
файлов.
void send_file_name(char f)
{
printf("Ожидание передачи\n");
do
- 36 -
{
sport(PORT,"?");
} while(!kbhit() && check_stat(PORT)&256);
if(kbhit())
{
getch();
exit(1);
}
wait(PORT); /******* ожидание квитирующего символа **/
printf ("Передано %s ",f);
/****************** фактическая передача имени файла **/
while (*f)
{
sport(PORT,*f++);
wait(PORT); /******* ожидание квитирующего байта **/
}
sport(PORT,"\n");/************** символ конца строки **/
printf("\n");
}
Функция send_file_name() предназначена для решения двух
основных задач.Во-первых,она устанавливает связь двух компь-
ютеров путем передачи ему маркера вопроса ("?") и дожидается
ответа от него в виде квитирующего байта (в качестве квитиру-
ющего байта используется точка,но можно любой другой сим-
вол).Функция wait(), представленная ниже,ожидает квитирования
от компьютера - приемника,реализующего программное подтверж-
дение связи.
void wait(int port) /****************** ожидание ответа **/
{
if (rport(port) != '.'
{
cout <<"Ошибка установления связи \n";
exit(1);
}
}
Таким образом , при обнаружении ошибки эта функция прек-
ращает свою работу.Однако можно предусмотреть обработку этой
ситуации.
Прием файла является прямо противоположенной операцией
передачи файла.Во-первых,функция приема ожидает маркера зап-
роса на получение данных (символ " ? ").На получение маркера
функция отвечает точкой (сигнал квитирования).После получения
имени файла функция ожидает получения его размера в байтах.В
конечном итоге функция начинает чтение файла.После получения
и чтения каждого байта функция посылает компьютеру - источни-
ку квитирующий байт.Таким образом она реализует программное
подтверждение связи.Функция rec_file() представлена ниже :
void rec_file()
{
FILE *fp;
char ch;
char fname[14];
struct {
char c[2];
- 37 -
unsigned int count;
} cnt;
get_file_name(fname); /******* получение имени файла **/
printf("Получен файл %s\n",fname);
remove(fname);
if( (fp = fopen(fname,"wb"))== NULL)
{
printf("Невозможно открыть файл %s\",fname);
exit(1);
}
/************ получение длины файла *****************/
sport(PORT,'.');/********************* квитирование **/
cnt.c[0] = rport(PORT);
sport(PORT,'.');/********************* квитирование **/
cnt.c[1] = rport(PORT);
sport(PORT,'.');/********************* квитирование **/
for(;cnt.count;cnt.count--)
{
ch = rport();
putch(ch,fp);
if(ferror(fp)){printf("Ошибка записи в файл \n");
exit(1);
}
sport(PORT,'.'); /******************* квитирование **/
fclose(fp);
}
void get_file_name(char *fp) /**** получение имени файла **/
{
printf("Ожидание получения файла \n ");
while(rport(PORT) != '?');
sport(PORT,'.'); /************************ квитирование **/
while( ( *f = rport() ) )
{ if(*f != '?')
{ f++;
sport(PORT,'.'); /**************** квитирование **/
}
}
}
я15.5. Схема сервисной розетки для разъема
я1"коммуникации"
Как уже говорилось выше для передачи данных через после-
довательный порт используется 3-х жильный провод и 9-ти или
25-ти штыревой разъем,типа DB9 или DB25.В технической доку-
ментации последовательные порты называются COM1,COM2 и.т.д.
В популярной программе Norton Commander существует воз-
можность передачи файлов от одного компьютера к другому.Для
этого надо соединить кабелем,схема которого представлена ни-
же,войти в панель Link ,назначить передающий и принимающий
компьютер,а также номера портов.После команды установить
связь (link) произойдет тестирование соединения,автоматически
установится скорость обмена и вид контроля.В случае успешного
завершения этой операции в одной из панелей появится список
- 38 -
файлов и директорий текущего дисковода компьютера с которым
была осущественна связь.После этого можно передавать и прини-
мать файлы.
Схема кабеля для передачи файлов через последовательный
порт.
ЪДДДДДДДДДДДДДДї ЪДДДДДДДДДДДДДДДї
і передаваемые і і принимаемые і
і данные ГДДДДДДДДДДДДДДДДДДґ данные і
ГДДДДДДДДДДДДДДґ ГДДДДДДДДДДДДДДДґ
і принимаемые і і передаваемые і
і данные ГДДДДДДДДДДДДДДДДДДґ данные і
ГДДДДДДДДДДДДДДґ ГДДДДДДДДДДДДДДДґ
і Земля ГДДДДДДДДДДДДДДДДДДґ Земля і
АДДДДДДДДДДДДДДЩ АДДДДДДДДДДДДДДДЩ
Схема использования 9-ти штыревого разъема.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДї
і Описание сигнала і No. і
і і кон.і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДґ ЪДї
і Передаваемые данные і 2 ГДДДДДДДДД> і3і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДґ ГДґ
і Принимаемые данные і 3 ГДДДДДДДДД> і2і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДґ
←предыдущая следующая→
... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
|