Скачиваний:
34
Добавлен:
15.09.2014
Размер:
4.27 Кб
Скачать
// com_laba.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
HANDLE hComm1, hComm2;
void InitComPort()
{
//	HANDLE hComm1, hComm2;
	DCB dcb1, dcb2; // структура device control block (DCB)

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

	hComm2 = CreateFile(TEXT("COM2"),GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,NULL);

	if(hComm1 == INVALID_HANDLE_VALUE)
	{
		puts("Error opening port!!!");
		_getch();
		abort();
	}
	if(hComm2 == INVALID_HANDLE_VALUE)
	{
		puts("Error opening port!!!");
		_getch();
		abort();
	}

	// Получили существующую структуру DCB
	if (!GetCommState(hComm1, &dcb1))
	{
		puts("Error opening DCB structure!!!");
		_getch();
		abort();
	}
	if (!GetCommState(hComm2, &dcb2))
	{
		puts("Error opening DCB structure!!!!!!");
		_getch();
		abort();
	}

	// Установили в ней свои параметры
	dcb1.BaudRate = CBR_57600; //Скорость передачи данных.
	dcb1.ByteSize = 8; //Определяет число информационных бит в передаваемых и принимаемых байтах.
	dcb1.Parity = NOPARITY; //Бит четности отсутствует
	dcb1.StopBits = ONESTOPBIT; //Один стоповый бит
	dcb1.fRtsControl = RTS_CONTROL_TOGGLE;//Задает, что сигнал RTS установлен, когда есть данные для передачи.
	//Когда все символы из передающего буфера переданы, сигнал сбрасывается.
	dcb2.BaudRate = CBR_57600; //Скорость передачи данных.
	dcb2.ByteSize = 8; //Определяет число информационных бит в передаваемых и принимаемых байтах.
	dcb2.Parity = NOPARITY; //Бит четности отсутствует
	dcb2.StopBits = ONESTOPBIT; //Один стоповый бит
	dcb2.fRtsControl = RTS_CONTROL_TOGGLE;//Задает, что сигнал RTS установлен, когда есть данные для передачи.

	// Установили новую структуру
	if (!SetCommState(hComm1, &dcb1))
	{
		puts("Error creating DCB structure!!! ");
		_getch();
		abort();
	}
	if (!SetCommState(hComm2, &dcb2))
	{
		puts("Error creating DCB structure!!! ");
		_getch();
		abort();
	}
}
void WriteCom(HANDLE hComm,char ch)
{
	DWORD writeNumByte = 0;
	if(!WriteFile(hComm, &ch, 1, &writeNumByte, NULL))
	{
		if(GetLastError() != ERROR_IO_PENDING)
		{
			puts("Error writing!!!");
			_getch();
			abort();
		}
	}
}
int ReadCom(HANDLE hComm, char &ch)
{
	DWORD dwRead;
	ReadFile(hComm, &ch, 1,&dwRead,0);
	return dwRead;
}

int main()
{
	HANDLE hComm;
	InitComPort();
	char str[100];
	DWORD dwBytesRead;
	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(hComm1, PURGE_TXCLEAR); // Чистим исхдящий буффер
	PurgeComm(hComm2, PURGE_RXCLEAR); // Чистим входной буффер

	coordWrite.X=0; coordWrite.Y=0;
	
	coordWrite.X=0; coordWrite.Y=2;
	coordRead.X=0; coordRead.Y=12;

	SetConsoleCursorPosition(hStdOut,coordWrite);
	puts("Enter text: ");

	SetConsoleCursorPosition(hStdOut,coordRead);
	puts("Text Received: ");

	coordWrite.Y = 4;
	coordRead.Y = 14;

	SetConsoleCursorPosition(hStdOut,coordWrite);

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

		ClearCommError(hComm2, &ErrorMask, &ComStat);
			chWrite = _getch();
			WriteFile(hComm1, (LPVOID)&chWrite, 1, &dwBytesRead, NULL);
			if(coordWrite.X==80)
						{
							coordWrite.X=0;
							coordWrite.Y++;
						}
			SetConsoleCursorPosition(hStdOut,coordWrite);
			cout << chWrite;
			coordWrite.X++;
			Sleep(10);
			ReadFile(hComm2, (LPVOID)&ch, 1, &dwBytesRead, NULL);
			coordRead.X++;
					SetConsoleCursorPosition(hStdOut,coordRead);
			cout << ch;
			if(coordRead.X==79)
					{
						coordRead.X=40;
						coordRead.Y++;
					}
			cout << ch;
		//	}
		//}*/
	}
	/*cin >> str;
	WriteFile(hComm1, str, 100, &dwBytesRead, NULL);
	Sleep(1000);
	ReadFile(hComm2, str, 100, &dwBytesRead, NULL);
	cout << str;*/
	return 0;
}