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

Страницы работы

Содержание работы

Министерство образования и науки РФ

Федеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования

 «Комсомольский-на-Амуре Государственный Технический Университет»

Факультет компьютерных технологий

Кафедра МОП ЭВМ

Лабораторная работа №2

по курсу «АВСКС»

Выполнил:                                                                                                         РогозинВ.А.

Проверил:                                                                                                          Изабеков З.А.

Комсомольск-на-Амуре

2007


Тема:                         «Программирование порта последовательной передачи данных».

Цель работы:          Изучить и научиться программировать порт последовательной передачи данных.

Задание:                    Написать программу, передающую через последовательный порт файл. Передача байтов осуществляется по прерыванию, скорость - 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

Похожие материалы

Информация о работе