Скачиваний:
33
Добавлен:
15.09.2014
Размер:
52.74 Кб
Скачать

Белорусский Государственный Университет Информатики и Радиоэлектроники

Кафедра ЭВМ

Отчет по лабораторной работе

Тема: «Программирование COM-порта»

Выполнил:

студент группы 750501 Демидовец А.Г.

Проверил:

к.т.н., доцент __________________ Одинец Д.Н.

Минск

2009

Постановка задачи

Разработать программу демонстрации пересылки последовательности символов(ФИО) между COM портами ПЭВМ в синхронном и асинхронном режимах.

Текст программы

#include <windows.h>

#include <conio.h>

#include <stdio.h>

HANDLE SetupComPort(); // Инициализация COM порта

void WriteToCom(HANDLE hComm,char ch); // Запись в COM порт

int ReadFromCom(HANDLE hComm, char &ch); // Чтение из COM порта

int main()

{

HANDLE hComm;

hComm = SetupComPort();

COORD coordRead, coordWrite; // Структура COORD : SHORT X; SHORT Y;

HANDLE hStdOut;

hStdOut=GetStdHandle(STD_OUTPUT_HANDLE); // Дескриптор устройства стандартного вывода.

COMSTAT ComStat; // В структуре храняться данные для коммуникации

DWORD ErrorMask = 0;

char chWrite;

char ch;

PurgeComm(hComm, PURGE_TXCLEAR); // Чистим исхдящий буффер

PurgeComm(hComm, PURGE_RXCLEAR); // Чистим входной буффер

coordWrite.X=0; coordWrite.Y=0;

coordRead.X=40; coordRead.Y=0;

SetConsoleCursorPosition(hStdOut,coordWrite);

printf("Write : ");

SetConsoleCursorPosition(hStdOut,coordRead);

printf("Read : ");

coordWrite.Y=2;

coordRead.Y=2;

SetConsoleCursorPosition(hStdOut,coordWrite);

while(1)

{

//Данная функция вызывается когда появляется ошибка соединения,

//и очищает флаг ошибки для разрещения записи или чтения

ClearCommError(hComm, &ErrorMask, &ComStat);

if(ComStat.cbInQue > 0) // Число символов в приемном буфере. Эти символы приняты из линии, но еще не считаны функцией ReadFile;

{

if(ReadFromCom(hComm,ch))

{

coordRead.X++;

SetConsoleCursorPosition(hStdOut,coordRead);

printf("%c",ch);

}

if(coordRead.X==79)

{

coordRead.X=40;

coordRead.Y++;

}

}

else

{

if(kbhit()) // Проверяет наличие ввода с клавиатуры (нажатие клавиши)

{

if(coordWrite.X==39)

{

coordWrite.X=0;

coordWrite.Y++;

}

chWrite = _getch();

SetConsoleCursorPosition(hStdOut,coordWrite);

printf("%c",chWrite);

coordWrite.X++;

WriteToCom(hComm,chWrite);

}

}

}

return 0;

}

HANDLE SetupComPort()

{

HANDLE hComm;

DCB dcb; // структура device control block (DCB)

hComm = CreateFile(TEXT("COM1"),GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,NULL);

if(hComm == INVALID_HANDLE_VALUE)

{

puts("Error opening port");

_getch();

abort();

}

// Получили существующую структуру DCB

if (!GetCommState(hComm, &dcb))

{

puts("Error! Couldn't create the DCB.");

_getch();

abort();

}

// Установили в ней свои параметры

dcb.BaudRate = CBR_57600; //Скорость передачи данных.

dcb.ByteSize = 8; //Определяет число информационных бит в передаваемых и принимаемых байтах.

dcb.Parity = NOPARITY; //Бит четности отсутствует

dcb.StopBits = ONESTOPBIT; //Один стоповый бит

dcb.fRtsControl = RTS_CONTROL_TOGGLE;//Задает, что сигнал RTS установлен, когда есть данные для передачи.

//Когда все символы из передающего буфера переданы, сигнал сбрасывается.

// Установили новую структуру

if (!SetCommState(hComm, &dcb))

{

puts("Error with creating DCB. ");

_getch();

abort();

}

else

{

return hComm;

}

}

void WriteToCom(HANDLE hComm,char ch)

{

DWORD writeNumByte = 0;

if(!WriteFile(hComm, &ch, 1, &writeNumByte, NULL))

{

if(GetLastError() != ERROR_IO_PENDING)

{

puts("Write file failed");

_getch();

abort();

}

}

}

int ReadFromCom(HANDLE hComm, char &ch)

{

DWORD dwRead;

ReadFile(hComm, &ch, 1,&dwRead,0);

return dwRead;

}

Заключение

В данной работы был изучен принцип работы последовательного порта COM, назначение его портов и способ программирования передачи данных.

Соседние файлы в папке 6 ком порт