|
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, 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;
} |
| |
|
|
|
|
|
|
|
для: Lepton
(11.01.2012 в 19:04)
| | А с чего данные читаете? Устройство точно на COM1 висит? | |
|
|
|
|
|
|
|
для: cheops
(11.01.2012 в 19:50)
| | Устройство на СОМ1. А данные считываю с фотоприемника. | |
|
|
|
|
|
|
|
для: Lepton
(11.01.2012 в 20:57)
| | Я так понимаю, что ситуацию даже не воспроизвести? А это устройство новое или для него уже имеется работающий драйвер? | |
|
|
|
|
9.8 Мб |
|
|
для: cheops
(12.01.2012 в 00:18)
| | Есть библиотека для работы с этим устройством | |
|
|
|