Ответить на сообщение
Вернуться к теме
Вы отвечаете на сообщение:
Автор: Lepton (11.01.2012 в 19:04) Пишу прогу для приема данных от внешнего устройства через 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; }
Ваше имя:
Пароль:
Цитировать Используйте тэги для выделения текста: Код: [code][/code] Жирный: [b][/b] Наклонный: [i][/i] URL: [url][/url]
Сообщение:
Прикрепить: