outp(REG_B,(inp(REG_B)|0x80)); //устанавливаем старший
//бит в управляющем регистре в 1
//Устанавливаем скорость передачи данных
outp(REG_P8,0x6); //помещаем в порт 3f8 младший байт делителя
outp(REG_P9,0); //помещаем в порт 3f9 старший байт делителя
//устанавливаем DLAB = 0
outp(REG_B,(inp(REG_B)&0x7f)); //устанавливаем старший бит в управляющем
//регистре в 0
outp(REG_B,0xb); //Записываем информацию о формате линии в
//управляющий регистр
OldHandler = getvect(0xC); // сохраняем старый адрес
//обработчика прерывания 0хС
setvect(0xC, New0Ch); // Устанавливаем новый обработчик прерывания
outp(REG_C,0x0b); //разрешаем линии OUT2, DTS, RTS
outp(REG_P9,0x02); //разрешаем прерывание от порта
//после приема данных
outp(0x21, 0); //размаскируем все прерываеия
delay(100) ;
//Возвращаем старый вектор обработки прерывания 0Ch
setvect(0xC, OldHandler);
cout << endl << "Файл передан";
getch();
}
// Обработчик прерывания
void interrupt New0Ch(...)
{
char outb;
outb = buffer[numb];
if (numb==0) cout << "Отправка имени файла" << endl;
if (numb==file_size_start) cout << endl << "Отправка размера файла" << endl;
if (numb==file_data_start) cout << endl << "Отправка файла" << endl;
outp(REG_P8,outb); //Отправляем байт
//cout << outb;
numb++;
delay(500);
if (numb <= file_data_end) outp(0x20,0x20); //очистка регистра
//обслуживания прерывания
}
Текст программы-клиента
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
// Определения регистров для COM1
#define REG_A 0x3fa
#define REG_B 0x3fb
#define REG_C 0x3fc
#define REG_D 0x3fd
#define REG_P8 0x3f8
#define REG_P9 0x3f9
#define TRUE 1
#define FALSE 0
void interrupt New0Ch(...); //Новый обработчик прерывания
void interrupt ( *OldHandler)(...); // Старый обработчик прерывания
volatile int byte; // Принимаемый байт
volatile int prinal; // Флаг принятия
void main()
{
clrscr();
int i; char str[256];
long l; //размер файла
prinal = FALSE;
//Инициализация COM порта
//устанавливаем DLAB = 1
outp(REG_B,(inp(REG_B)|0x80)); //устанавливаем старший
//бит в управляющем регистре в 1
//Устанавливаем скорость передачи данных
outp(REG_P8,0x6); //помещаем в порт 3f8 младший байт делителя
outp(REG_P9,0); //помещаем в порт 3f9 старший байт делителя
//устанавливаем DLAB = 0
outp(REG_B,(inp(REG_B)&0x7f)); //устанавливаем старший
//бит в управляющем регистре в 0
outp(REG_B,0xb); //Записываем информацию о формате линии в
//управляющий регистр
OldHandler = getvect(0xC); // сохраняем старый адрес
//обработчика прерывания 0хС
setvect(0xC, New0Ch); // Устанавливаем новый обработчик прерывания
outp(REG_C,0x0b); //разрешаем линии OUT2, DTS, RTS
outp(REG_P9,0x01); //разрешаем прерывание от порта
//после приема данных
outp(0x21,0); //Размаскируем все прерывания
delay(100);
i = 0;
cout << "Имя принемаевого файла:" << endl;
do
{
while(prinal == FALSE) ;
prinal = FALSE;
printf ("%c",byte);
str[i] = byte;
i++;
}while(byte != '\0');
//удаляет файл с таким же именем, если он существует
remove (str);
FILE *f;
if((f = fopen(str, "wb")) == NULL)
{
cout << "Ошибка при создании файла\n";
setvect(0xC, OldHandler);
getch();
exit(1);
}
cout << endl << "Размер файла:" << endl;
i=0;
do //принимаем размер файла
{
while(prinal == FALSE) ;
prinal = FALSE;
str[i] = byte;
i++;
} while (str [i-1]!='\0');
l=atol (str);
cout << l << endl;
cout << "Передача файла\n";
do //запись в файл
{
while(prinal == FALSE) ;
prinal = FALSE;
//printf("%c", byte); //выводим на экран принятый символ
fwrite((void*)&byte, 1, 1, f); //записываем его в файл
l=l-1;
}while(l != 0);
fclose(f);
setvect(0xC, OldHandler); //Возвращаем старый вектор обработки прерывания 0Ch
cout << endl << "Файл принят";
getch();
}
void interrupt New0Ch(...) // Обработчик прерывания
{
byte = inp(REG_P8); // Считываем байт
prinal = TRUE; // Устанавливаем флаг принятия байта
outp(0x20,0x20); //очистка регистра обслуживания прерывания
}
Результат работы программы
Рис. 1. Результат работы программы-сервер
Рис. 2. Результат работы программы-клиент
Список использованных источников
1. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 1. Часть 1, 2, 3. Операционная система MS-DOS. М: ДИАЛОГ-МИФИ, 1991, 1993
2. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 2. Аппаратное обеспечение IBM PC. Часть 1, 2. М: ДИАЛОГ-МИФИ, 1992
3. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 18. Часть 1, 2. MS-DOS для программиста. М: ДИАЛОГ-МИФИ, 1995
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.