Программирование порта последовательной передачи данных, страница 2

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