по курсу «АВСКС»
Выполнил: РогозинВ.А.
Проверил: Изабеков З.А.
Комсомольск-на-Амуре
Цель работы: Изучить и научиться программировать порт последовательной передачи данных.
Задание: Написать программу, передающую через последовательный порт файл. Передача байтов осуществляется по прерыванию, скорость - 19200 бод, число стоповых бит – 1, проверка на нечетность.
Описание работы программы
Программа - передатчик.
В программе - передатчике в начале формируется буфер для передачи, содержащий информацию об имени файла, его размере и далее сам файл. Затем инициализируем COM-порт. В ходе инициализации сначала в управляющем регистре 3FBh старший бит устанавливается в 1 - по портам 3F8h и 3F9h находятся регистры младшего и старшего байта делителя скорости передачи. Далее записываем в порты 3F8h и 3F9h младший байт (6h) и старший байт (00h) делителя скорости 19200 бод соответственно. В управляющем регистре 3FBh устанавливаем старший бит обратно в 0, т.е. по портам 3F8h и 3F9h теперь находятся регистр хранения передатчика и регистр управления прерыванием. Затем записываем в регистр управления линией информацию о формате кадра: длина передаваемых слов в битах = 8, поэтому биты 0 и 1 равны 1, количество стоповых бит = 1, поэтому бит 2 равен 0, осуществляется проверка на нечетность, поэтому биты 3 и 4 равны 01. Сохраняем адрес старого обработчика прерываний от COM1 (0x0C) с помощью команды getvect() и устанавливаем новый обработчик командой setvect(). Разрешаем прерывание от порта, записав в регистр управления прерыванием 3F9h значение 0x02h. Размаскируем все прерывания, записав в порт 21h значение 0.
В обработчике прерывания происходит отправка очередного символа из буфера, для этого в регистр хранения передатчика 3F8h записываем передаваемый символ. Далее очищается регистр обслуживания прерывания: в порт 20h заносится 20h.
Программа - приемник.
В программе – приемнике в самом начале происходит инициализация COM1 и перехват прерывания 0x0Ch. В ходе инициализации в порт 3F9 заносится 0х01 – разрешаем прерывание от порта после приема данных. В остальном, инициализация аналогична инициализации в программе – передатчике.
В обработчике прерывания считываем принятый байт из порта 3F8 и записываем его в переменную byte (тип volatile int). Устанавливаем флаг принятия prinal (тип volatile int) в 1. Далее очищается регистр обслуживания прерывания: в порт 20h заносится 20h.
В главной программе для получения очередного символа каждый раз происходит ожидание установки флага принятия (т.е. переменная byte содержит очередной принятый символ). Таким образом, программа получает имя файла, его размер, создает файл с таким именем и далее получает символы, записывая их в файл, согласно размеру файла.
Текст программы-сервера
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <string.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
volatile int numb; //индекс отправляемого элемента массива buffer
void interrupt New0Ch(...); // Новый обработчик прерывания порта COM1 0x0Ch
void interrupt (*OldHandler)(...); // Старый обработчик прерывания
char buffer[10000];
int file_size_start; //байт - начало размера файла
int file_data_start; //байт - начало данных файла
int file_data_end; // байт - конец данных файла
void main()
{
clrscr();
int i, j;
char buf;
long size;
numb = 0;
char str[256];
cout << "Файл?: ";
cin >> str;
FILE *f;
if((f = fopen(str, "rb")) == NULL)
{
cout << "файл не найден";
getch();
exit(1);
}
for(i = 0; i <= strlen(str); i++)
{
buffer[i] = str[i];
}
file_size_start = i;
//Записать в буфер размер файла
ffblk ffb; //DOS file control block structure
findfirst(str, &ffb, 0); // 0 - Normal file, no attributes
size = ffb.ff_fsize;
ltoa(size, str, 10);
i = 0;
j = file_size_start ;
while(1)
{
buffer[j] = str[i];
if(str[i] == '\0') break;
i++;j++;
}
file_data_start = j+1;
// Записшем файл в буфер
i = file_data_start ;
do
{
fread(&buf, 1, 1, f); // Читаем байт
buffer[i++] = buf;
size = size - 1;
} while(size != 0); // Пока не пошлем весь файл
file_data_end = i-1;
fclose(f);
//Инициализация COM-порта
//устанавливаем DLAB = 1
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.