ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
661190
Mebius (18.03.2016 15:37, просмотров: 17395)
Други, владеющие Win32! Помогите Христа ради! Почему GetOverlappedResult упорно возвращает мне 4 байта, в то время как я посылаю 14? Код ниже. Цель кода - принять посылку произвольной длины. 
// acket.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <stdio.h>
#include "windows.h"
//#include <process.h>
//#include <errno.h>
#include <string.h>
//#include <iostream>
#include <clocale>

#define READ_TIME	INFINITE	//3000

typedef struct {
	HANDLE		port;
	UCHAR*		dst;
	DWORD		len;
	DWORD		transfer;
	OVERLAPPED	sync;
	DWORD		state;
//	HANDLE		timer;
} stSerial;

UCHAR buf[1200];				// приёмный буфер


void AbortProgram(stSerial* s, LPTSTR lpszFunction);
static void ExitProgram (stSerial* s, const wchar_t *format, ...);

int _tmain(int argc, _TCHAR* argv[])
{

	DWORD wait = 0;			// флаги завершения WaitForSingleObject
	WORD i;					// счётчик
	wchar_t lpszMsg[128];
/*
#pragma pack(1)
		 union {
			UCHAR	bytes[258];
			struct {
				UCHAR DevId;
				UCHAR OPCODE;
				UCHAR data[256];
			} msg;
		} cmd;
#pragma pack()
*/
	DCB dcb = {0};
	COMMTIMEOUTS cto ={0};
	static stSerial	s = {0};	// структура порта

	setlocale(LC_CTYPE, "rus");

	/* Создаем объект синхронизации */
	s.sync.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

	_stprintf_p(lpszMsg, sizeof(lpszMsg), _T("\\\\.\\%s"), argv[1]);

	s.port = CreateFile(lpszMsg, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
	if (s.port == INVALID_HANDLE_VALUE) AbortProgram(&s, _T("OpenPort"));

//-------------первоначальная настройка порта---------------------------
	dcb.DCBlength = sizeof(DCB);

	if (!GetCommState(s.port, &dcb)) AbortProgram(&s, _T("GetCommState"));

	dcb.BaudRate = CBR_19200;	//  baud rate
	dcb.ByteSize = 8;			//  data size, xmit and rcv
	dcb.Parity   = NOPARITY;	//  parity bit
	dcb.StopBits = ONESTOPBIT;	//  stop bit
	dcb.EvtChar  = 0x03;

	if (!SetCommState(s.port, &dcb)) AbortProgram(&s, _T("SetCommState"));

	cto.ReadIntervalTimeout = NULL;	//4*(1000*10)/CBR_19200;
	cto.WriteTotalTimeoutMultiplier = (1000*10)/CBR_19200;
	cto.WriteTotalTimeoutConstant = 1;

	if (!SetCommTimeouts(s.port,&cto)) AbortProgram(&s, _T("SetCommState"));

	SetupComm(s.port,1200,1200);		// Устанавливаем размеры буферов приёма и передачи (для ymodem - 1200 байт)
//----------------------------------------------------------
	/* Устанавливаем маску на события порта */
	if(!SetCommMask(s.port, EV_RXFLAG)) AbortProgram(&s, _T("SetCommMask"));

//--------------------приём запроса----------------------------
	s.dst = buf;
	s.dst[0] = 0;
	s.len = 160;	//sizeof(s.dst);

	WaitCommEvent(s.port, &(s.state), &(s.sync));

	wait = WaitForSingleObject(s.sync.hEvent, READ_TIME);
	switch (wait) {
	case WAIT_FAILED:
		AbortProgram(&s, _T("getSerial.WaitForSingleObject"));
	case WAIT_TIMEOUT:
		ExitProgram(&s, _T("getSerial.WaitForSingleObject завершился тайм-аутом\n"));
	case WAIT_ABANDONED:
		ExitProgram(&s, _T("getSerial.WaitForSingleObject завершился потерей\n"));
	}

	if(FALSE == GetOverlappedResult(s.port, &(s.sync), &(s.transfer), FALSE)) AbortProgram(&s, _T("getSerial.GetOverlappedResult"));
	ReadFile(s.port, buf, s.transfer, &(s.len), &s.sync);

	_tprintf(_T("Принято %d байт:\n"), s.transfer);
}