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

HANDLE SetupComPort();									   //Инициализация Ком
void WriteToCom(HANDLE hComm,char ch);                     //Запись в порт
int ReadFromCom(HANDLE hComm, char &ch);				   //Чтение из порта

int main()
{
	
	HANDLE hComm;
	hComm = SetupComPort();            //инициализируем ком
	
	HANDLE hStdOut;
	COORD coordRead, coordWrite, coordWall;
	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;
	
	coordWall.Y=0;
	
	coordRead.X=40;
	coordRead.Y=0;
	
	SetConsoleCursorPosition(hStdOut,coordWrite);
	printf("Write : ");
	coordWrite.Y=2;
	
	SetConsoleCursorPosition(hStdOut,coordRead);
	printf("Read : ");
	coordRead.Y=2;
	
	coordWrite.Y=1;
	SetConsoleCursorPosition(hStdOut,coordWrite);
	printf("--------------------------------------------------------------------------------");
	
	
	coordWrite.Y=2;
	SetConsoleCursorPosition(hStdOut,coordWrite);


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

		//Specifies the number of bytes received by the serial provider 
		//but not yet read by a ReadFile operation.
		if(ComStat.cbInQue > 0)
		{

			if(ReadFromCom(hComm,ch))
			{
					coordRead.X++;
					SetConsoleCursorPosition(hStdOut,coordRead);
					printf("%c",ch);
			}
			if(coordRead.X==79){
				coordRead.X=40;
				coordRead.Y++;
				coordWall.Y=coordRead.Y;
			}
		}
		else if(kbhit())
		{
			if(coordWrite.X==39)
			{
				printf("|");
				coordWrite.X=0;
				coordWrite.Y++;
				coordWall.Y=coordWrite.Y;
			}
			chWrite = _getch();
			SetConsoleCursorPosition(hStdOut,coordWrite);
			printf("%c",chWrite);
			coordWrite.X++;
			WriteToCom(hComm,chWrite);
		}
	}
	return 1;
}

HANDLE SetupComPort()
{
	HANDLE hComm;
	DCB dcb;
	hComm = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
	if(hComm == INVALID_HANDLE_VALUE)
		abort();
	if (!GetCommState(hComm, &dcb))
	{
		puts("Error! Couldn't create the DCB.");
		abort();
	}
	dcb.BaudRate = CBR_57600;
	dcb.ByteSize = 8;
	dcb.Parity = NOPARITY;
	dcb.StopBits = ONESTOPBIT;
	dcb.fRtsControl = RTS_CONTROL_TOGGLE;
	if (!SetCommState(hComm, &dcb))
	{
		puts("Error with creating DCB. ");
		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");
	return;
}

int ReadFromCom(HANDLE hComm, char &ch)
{
	DWORD dwRead;
	ReadFile(hComm, &ch, 1,&dwRead,0);
	return dwRead;
}