АВМиС - Лабы / 6 ком порт / Отчет_com
.docБелорусский Государственный Университет Информатики и Радиоэлектроники
Кафедра ЭВМ
Отчет по лабораторной работе
Тема: «Программирование 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, назначение его портов и способ программирования передачи данных.