Форум: Форум C++Разное
Новые темы: 00
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не могу принять данные с COMport
 
 автор: Lepton   (11.01.2012 в 19:04)   письмо автору
3.7 Мб
 
 

Пишу прогу для приема данных от внешнего устройства через 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, truetrue, 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;

}

  Ответить  
 
 автор: cheops   (11.01.2012 в 19:50)   письмо автору
 
   для: Lepton   (11.01.2012 в 19:04)
 

А с чего данные читаете? Устройство точно на COM1 висит?

  Ответить  
 
 автор: Lepton   (11.01.2012 в 20:57)   письмо автору
 
   для: cheops   (11.01.2012 в 19:50)
 

Устройство на СОМ1. А данные считываю с фотоприемника.

  Ответить  
 
 автор: cheops   (12.01.2012 в 00:18)   письмо автору
 
   для: Lepton   (11.01.2012 в 20:57)
 

Я так понимаю, что ситуацию даже не воспроизвести? А это устройство новое или для него уже имеется работающий драйвер?

  Ответить  
 
 автор: Lepton   (12.01.2012 в 01:21)   письмо автору
9.8 Мб
 
   для: cheops   (12.01.2012 в 00:18)
 

Есть библиотека для работы с этим устройством

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования