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

int clsh=0;
DCB          comSettings;          // структура с настройками ком порта
COMMTIMEOUTS CommTimeouts;
char comp[10];
void *aRead(void *par)
{
		char INBUFFER1[1];//буфер для передачи информации
		OVERLAPPED ov2; //структура для асинхронного чтения
		DWORD        bytes_read1    = 0; //кол-во прочитанных байт
		DWORD        bStatus    = 0; //состояние передачи
		HANDLE comport2; //хэндл ком порта
		clsh=0;
		comport2 = 
		CreateFile(comp,                // открытие ком порта
			GENERIC_READ | GENERIC_WRITE, // 
			0,                            // 
			NULL,                         // 
			OPEN_EXISTING,              
			0,
			NULL);
		CommTimeouts.ReadIntervalTimeout         = 100;  //настройки нтервала для чтения
			CommTimeouts.ReadTotalTimeoutMultiplier  = 0; 
			CommTimeouts.ReadTotalTimeoutConstant    = 200; //общее время ожидания
			CommTimeouts.WriteTotalTimeoutMultiplier = 0;
			CommTimeouts.WriteTotalTimeoutConstant   = 0;
			bStatus = SetCommTimeouts(comport2,&CommTimeouts);
		GetCommState(comport2, &comSettings);
			comSettings.BaudRate = CBR_9600; //скорость чтения
			comSettings.fBinary = true;
			comSettings.StopBits = ONESTOPBIT; //передача по битам
			comSettings.ByteSize = 8; //размер байта
			comSettings.Parity   = NOPARITY;
			comSettings.fParity  = FALSE;
			bStatus = SetCommState(comport2, &comSettings); //передача параметров
		while(1)
		{
			INBUFFER1[0]='\0';
			if(clsh==1)
			{
				CloseHandle(comport2);
				return NULL;
			}
				bStatus = ReadFile(comport2,   // Handle
							&INBUFFER1,            // входящая информация
							1,                  
							&bytes_read1,         
							NULL);
				if(INBUFFER1[0]!='\0')
					printf("%c",INBUFFER1[0]);
		}
}
int main()
{
    char OUTBUFFER[50]; //буфер для обмена информации
	char a;
    DWORD        bytes_read    = 0;    // кол-во байт прочитанных с порта
    DWORD        bytes_written = 0;    // кол-во байт считанных с порта
	DWORD        id;
    HANDLE       comport1 = NULL,rThr=NULL;  // хэндл второго ком порта
	int   bStatus;
	do
		{
			system("CLS");
			puts("Enter com port to open");
			gets(comp);
			comport1 = 
			CreateFile(comp,                // окрытие ком порта
				GENERIC_READ | GENERIC_WRITE, 
				0,                          
				NULL,                        
				OPEN_EXISTING,              
				0,
				NULL);
			if(comport1==INVALID_HANDLE_VALUE)
			{
				puts("Cannot open COM port");
				getch();
			}
		}while(comport1==INVALID_HANDLE_VALUE);
	CloseHandle(comport1);

	while(1)
	{
		CommTimeouts.ReadIntervalTimeout         = 100; 
			CommTimeouts.ReadTotalTimeoutMultiplier  = 0; 
			CommTimeouts.ReadTotalTimeoutConstant    = 200;
			CommTimeouts.WriteTotalTimeoutMultiplier = 0;
			CommTimeouts.WriteTotalTimeoutConstant   = 0;			
		GetCommState(comport1, &comSettings);
			comSettings.BaudRate = CBR_9600;
			comSettings.fBinary = true;
			comSettings.StopBits = ONESTOPBIT;
			comSettings.ByteSize = 8;
			comSettings.Parity   = NOPARITY;
			comSettings.fParity  = FALSE;			
			rThr=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)aRead,(void *)comport1,NULL,&id);
		while(1)
		{
		system("CLS");
		puts("1 - send string\n0 - exit");
		a=getch();
		if(a=='1')
			{
			clsh=1;
			system("CLS");
			puts("Enter string in COM:");
			gets(OUTBUFFER);

				comport1 = 	CreateFile(comp,              
				GENERIC_READ | GENERIC_WRITE, 
				0,                            
				NULL,                        
				OPEN_EXISTING,              
				0,
				NULL);

			bStatus = SetCommTimeouts(comport1,&CommTimeouts);
			bStatus = SetCommState(comport1, &comSettings);
			bStatus = WriteFile(comport1,             
		    &OUTBUFFER,      
			strlen(OUTBUFFER),             
		    &bytes_written,  
		     NULL);
			CloseHandle(comport1);
			rThr=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)aRead,(void *)comport1,NULL,&id);
			break;
			}
		if(a=='0')
		{
			TerminateThread(rThr,0);//закрытие второго потока
			CloseHandle(comport1);
			return 0;
		}
		}
	}

 return 0;
}