Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 19:20   #1
Lepton
Новичок
Джуниор
 
Регистрация: 11.01.2012
Сообщений: 2
По умолчанию Не могу принять данные с COMport

Пишу прогу для приема данных от внешнего устройства через COMport. Данные должны быть записаны в файл. Порт открываю, а данные принять не могу((. Помогите

Код:

#include "stdafx.h"
#include "windows.h"
#include <iostream>
#include <locale.h>
#include <fcntl.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <stdlib.h>
#include <fstream>
#include <io.h>


#define BUFSIZE 255
unsigned char bufrd[BUFSIZE], bufwr[BUFSIZE];
using namespace std;



HANDLE COMport;
int handle;
DCB dcb;
COMMTIMEOUTS timeouts;
unsigned long counter;
HANDLE reader, writer;
OVERLAPPED overlapped;
OVERLAPPED overlappedwr;




DWORD WINAPI ReadThread(LPVOID);
HRESULT COMOpen (void);
void COMClose (void);
void ReadPrinting(void);



DWORD WINAPI ReadThread(LPVOID)
{
	
COMSTAT comstat;
DWORD btr = 0, temp, mask, signal;
overlapped.hEvent = CreateEvent(NULL, true, true, NULL);
SetCommMask (COMport, EV_RXCHAR);
while (1)
{
WaitCommEvent (COMport, &mask, &overlapped);
signal = WaitForSingleObject (overlapped.hEvent, INFINITE);
if (signal == WAIT_OBJECT_0)
  {
	if (GetOverlappedResult (COMport, &overlapped, &temp, true))
		if ((mask&EV_RXCHAR)!=0)
		{
			ClearCommError (COMport, &temp, &comstat);
			btr = comstat.cbInQue;
			if (btr)
			{
				ReadFile(COMport, bufrd, btr, &temp, &overlapped);
			    counter +=btr;
				ReadPrinting();
		
			}			
        }
   }
}
return btr;
}



HRESULT COMOpen()
{
	COMport = CreateFile(_T("COM1"), GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
	if (COMport == INVALID_HANDLE_VALUE)
	{
	cout << "Не удалось открыть порт..." << endl;
	return E_FAIL;

	}
	else
	{	
	cout << "Порт открыт..." << endl;

	}
	
	if (!SetCommMask (COMport, EV_RXCHAR))
	{		
		COMClose();
		cout << "Ошибка маски..." << endl;
	return E_FAIL;
	}
	else
	{	
	cout << "Маска - Ок... " << endl;

	}
	if (!GetCommState (COMport, &dcb))
	{		
		COMClose();
		cout << "Не удалось считать DCB..." << endl;
	return E_FAIL;
	}
	else
	{	
	cout << "Структура DCB считана из порта... " << endl;
	}
dcb.DCBlength = sizeof(DCB);

	dcb.BaudRate = 115200;
	dcb.fBinary = TRUE;
	dcb.fOutxCtsFlow = FALSE;
	dcb.fOutxDsrFlow = FALSE;
	dcb.fDtrControl = DTR_CONTROL_ENABLE;
	dcb.fDsrSensitivity = 0;
	dcb.fNull = FALSE;
	dcb.fRtsControl = RTS_CONTROL_DISABLE;
	dcb.fAbortOnError = FALSE;   
	dcb.Parity = 0;
	dcb.StopBits =0;
	dcb.ByteSize = 8;

	if (!SetCommState(COMport, &dcb))
	{
		COMClose();
		cout << "Не удалось загрузить структуру DCB в порт..." << endl;
		return E_FAIL;
    }
	else
	{	
	cout << "Структура DCB успешно загружена в порт... " << endl;

	}
	timeouts.ReadIntervalTimeout = MAXDWORD;
	timeouts.ReadTotalTimeoutMultiplier = 0;
	timeouts.ReadTotalTimeoutConstant = 0;
	timeouts.WriteTotalTimeoutMultiplier = 0;
	timeouts.WriteTotalTimeoutConstant = 0;

	if (!SetCommTimeouts(COMport, &timeouts))
	{
		COMClose();
		cout << "Не удалось установить тайм-ауты" << endl;
		return E_FAIL;
	}                                                                                                                                                                                                                                                                      
	else
	{	
	cout << "Тайм-ауты установлены... " << endl;

	}
	overlapped.hEvent = CreateEvent(NULL, NULL, NULL, NULL);


	SetupComm(COMport, 2000, 2000);

	handle = open("com_res.txt", O_CREAT | O_APPEND | O_BINARY | O_WRONLY, S_IREAD | S_IWRITE);
	 if(handle==-1)		//если произошла ошибка открытия файла
  {
     cout << "Произошла ошибка открытия файла..." << endl;
 
  }

 else
 { 
	 
	 cout << "Файл открыт успешно..." << endl;
 }

    //PurgeComm(COMport, PURGE_RXCLEAR);	

   
}


void COMClose()
{

 if(writer)
  {TerminateThread(writer,0);
   CloseHandle(overlappedwr.hEvent);	
   CloseHandle(writer);
  } 
 if(reader)
  {TerminateThread(reader,0);
   CloseHandle(overlapped.hEvent);	
   CloseHandle(reader);
  }
 CloseHandle(COMport); 
 COMport=0;		
 close(handle);		
 handle=0;		
}


void ReadPrinting()
{
 ofstream f("com_res.txt");

 for (int i = 0; i < counter;  ++i)
 {
	 
	 cin >> ((char*)bufrd);
	 f << ((char*)bufrd);
	 

 }
 cout << ((char*)bufrd) << endl;	
 memset(bufrd, 0, BUFSIZE);	        
}


int main ()
{	setlocale(LC_ALL,"Russian");

	COMOpen();
	reader = CreateThread(NULL, 0, ReadThread, NULL, 0, NULL);
	ReadPrinting();
	system ("pause");
    return 0;

}
Вложения
Тип файла: zip COMport.zip (3.71 Мб, 14 просмотров)
Lepton вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ComPort fedor6124 Общие вопросы Delphi 0 28.10.2011 21:22
COM порт, как принять данные? gusluk Общие вопросы Delphi 3 11.09.2009 08:10
Нужно в PHP принять данные из CGI exploys PHP 13 10.06.2009 02:48