Скачиваний:
33
Добавлен:
15.09.2014
Размер:
3.3 Кб
Скачать
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <iostream> 

HANDLE InitComPort()
{
	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("Ошибка открытия порта!!!");
		_getch();
		abort();
	}

	// Получили существующую структуру DCB
	if (!GetCommState(hComm, &dcb)) 
	{
		puts("Ошибка! Невозможно открыть 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("Ошибка создания DCB структуры!!! ");
		_getch();
		abort();
	}
	else return hComm;
}
void WriteCom(HANDLE hComm,char ch)
{
	DWORD writeNumByte = 0;
	if(!WriteFile(hComm, &ch, 1, &writeNumByte, NULL))
	{
		if(GetLastError() != ERROR_IO_PENDING)
		{
			puts("Ошибка файла записи!!!");
			_getch();
			abort();
		}
	}
}
int ReadCom(HANDLE hComm, char &ch)
{
	DWORD dwRead;
	ReadFile(hComm, &ch, 1,&dwRead,0);
	return dwRead;
}

int main()
{
	HANDLE hComm;
	hComm = InitComPort();                 
	
	COORD coordRead, coordWrite;    // Структура COORD : SHORT X;  SHORT Y;

    HANDLE hStdOut;
	hStdOut=GetStdHandle(STD_OUTPUT_HANDLE); // Дескриптор устройства стандартного вывода.
	
    COMSTAT ComStat;			    // В структуре храняться данные для коммуникации
	DWORD ErrorMask = 0;
	char chWrite;
	char ch;
	
	setlocale(LC_ALL,"Russian");
	PurgeComm(hComm, PURGE_TXCLEAR); // Чистим исхдящий буффер
	PurgeComm(hComm, PURGE_RXCLEAR); // Чистим входной буффер
	
	coordWrite.X=0; coordWrite.Y=0;
	printf("Лабораторная работа №6. COM-порт(последовательный порт)");

	coordWrite.X=0; coordWrite.Y=2;
	coordRead.X=0; coordRead.Y=12;
	
	SetConsoleCursorPosition(hStdOut,coordWrite);
	puts("Вводим текст: ");
	
	SetConsoleCursorPosition(hStdOut,coordRead);
	puts("Получаем текст: ");
	
	coordWrite.Y = 4;
	coordRead.Y = 14;

	SetConsoleCursorPosition(hStdOut,coordWrite);

	while(1)
	{
		//Данная функция вызывается когда появляется ошибка соединения, 
		//и очищает флаг ошибки для разрещения записи или чтения
		
		ClearCommError(hComm, &ErrorMask, &ComStat);

		if(ComStat.cbInQue > 0)
		{
			if(ReadCom(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==80)
				{
					coordWrite.X=0;
					coordWrite.Y++;
				}
				chWrite = _getch();
				SetConsoleCursorPosition(hStdOut,coordWrite);
				printf("%c",chWrite);
				coordWrite.X++;
				WriteCom(hComm,chWrite);	
			}
		}
	}
	return 0;
}
Соседние файлы в папке 6 ком порт