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

HANDLE m_Handle2;
HANDLE hEvent;
HANDLE hCOM;
bool isClose = FALSE;
using namespace std;

void read()
{
	char *buf = new char[30];
	memset(buf, 0, 30*sizeof(char));
	DWORD real;
	while(1)
	{
		WaitForSingleObject(hEvent, INFINITE);
		if(!ReadFile(m_Handle2, buf, 30, &real, NULL))
			cout << "read error\n";
		buf[real] = '\0';
		if(buf[0] != '\0')
		{
			if(!strcmp(buf, ":q"))
			{
				WriteFile(m_Handle2, buf, 30, &real, NULL);
				CloseHandle(hCOM);
				return;
			}
			cout << "ACCEPTING:         <" << buf << ">\n\n";
			memset(buf, 0, 30*sizeof(char));
		}
		SetEvent(hEvent);
		Sleep(1000);
	}
}

void write(void *arg)
{
	char buf[30];
	memset(&buf, 0, 30*sizeof(char));
	while(1) 
	{
		gets(buf);
		puts("");
		if(buf[0] != '\0')
		{
			WaitForSingleObject(hEvent, INFINITE);
			DWORD real;
			if(!WriteFile(m_Handle2, buf, 30, &real, NULL))
				cout << "write error \n";
			SetEvent(hEvent);
			memset(&buf, 0, 30*sizeof(char));
		}
	}
}

int main(int argc, char *argv[])
{
	m_Handle2 = CreateFileA(argv[1], GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
	hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);

	if(m_Handle2 == INVALID_HANDLE_VALUE) {
		cout << GetLastError() << ": error at opening\n";
 	}
 
 	SetCommMask(m_Handle2, EV_RXCHAR);
 	SetupComm(m_Handle2, 128, 128);
	
	COMMTIMEOUTS CommTimeOuts2;
	GetCommTimeouts(m_Handle2, &CommTimeOuts2);
	CommTimeOuts2.ReadIntervalTimeout = 50;
 	CommTimeOuts2.ReadTotalTimeoutMultiplier = 10;
 	CommTimeOuts2.ReadTotalTimeoutConstant = 50;
 	CommTimeOuts2.WriteTotalTimeoutMultiplier = 10;
 	CommTimeOuts2.WriteTotalTimeoutConstant = 50;
 
 	if(!SetCommTimeouts(m_Handle2, &CommTimeOuts2)) {
		cout << GetLastError() << ": error of set of timeout\n";
 	}
 
 	DCB ComDCM2;
 
 	memset(&ComDCM2,0,sizeof(ComDCM2));
 	ComDCM2.DCBlength = sizeof(DCB);
 	GetCommState(m_Handle2, &ComDCM2);
	ComDCM2.BaudRate = CBR_9600;
 	ComDCM2.ByteSize = 8;
 	ComDCM2.Parity = NOPARITY;
 	ComDCM2.StopBits = ONESTOPBIT;
 	ComDCM2.fAbortOnError = TRUE;
 	ComDCM2.fDtrControl = 1;
 	ComDCM2.fRtsControl = 0;
 	ComDCM2.fBinary = TRUE;
 	ComDCM2.fParity = FALSE;
 	ComDCM2.fInX = ComDCM2.fOutX = 1;
	ComDCM2.fTXContinueOnXoff = 1;
 	ComDCM2.XonChar = 0x19;
	ComDCM2.XoffChar = 0x13;
 	ComDCM2.fErrorChar = FALSE;
 	ComDCM2.fNull = FALSE;
 	ComDCM2.fOutxCtsFlow = 0;
 	ComDCM2.fOutxDsrFlow = 0;
 	ComDCM2.XonLim = 128;
 	ComDCM2.XoffLim = 128;
 
 	if(!SetCommState(m_Handle2, &ComDCM2)) {
		cout << GetLastError << ": error of installation of state\n";
 	}
	
	cout << "..............." << argv[1] << "...............\n\n";
	hCOM = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)write, NULL, NULL, NULL);
	HANDLE hCOM2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)read, NULL, NULL, NULL);
	//WaitForSingleObject(hCOM, INFINITE);
	WaitForSingleObject(hCOM2, INFINITE);
	CloseHandle(hEvent);
	CloseHandle(hCOM2);
	CloseHandle(m_Handle2);
	return 0;
}