[C con Clase] puerto serie

Emiliano Nuñez emilianito en hotmail.com
Dom Dic 24 22:13:29 CET 2006


Hola lista, resulta que tengo un control remoto con el correspondiente 
receptor que va conectado al puerto serie, estoy haciendo un programa para 
obtener los bytes que el mando me envia cada vez que presiono una tecla, el 
programa escucha el puerto y cuando apreto un boton me envia los bytes 
recibidos, hací yo puedo actuar en funcion de estos.
El problema es que aveces (es impredecible) aparecen datos leidos sin que yo 
presione una tecla, o sea, por ejemplo, el programa dice "escichando" y 
aparecen bytes normalmente FF, FD, o FE, o sea, lee esos bytes del puerto 
serie sin que yo haya apretado ninguna tecla, y estos aveces si yo estoy 
apretando teclas se mezclan con lo verdaderos bytes que he enviado.

digamos que la salida deberia ser esta:

listando.........

32,45,A1  ---> aprete la tecla x
43,CD,2A ----> aprete la tecla y
.
.
.

pero la salida es:

listando.....

FF (no aprete nada)
FE (no aprete nada)

32,45,A1 (aprete la tecla x)

43,FF,CD,2A (aprete la tecla y)

o sea, es como si se meten bytes que no tendrían que estar allí, como si 
otro programa estubiese escribiendo esos bytes en el puerto paralelo.

no se si alguíen podrá ayudarme.

dejo el codigo (compilado con vc++)

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <winsock.h>


void main(int argc, char* argv[])
{
	char cadena[1024];
	DCB dcb;
	HANDLE hCom;
	DWORD dwError;
	BOOL fSuccess;


	printf("escuchandoooooooo...\n");

	hCom = CreateFile( "com1",
		GENERIC_READ | GENERIC_WRITE,
		0,    // comm devices must be opened w/exclusive-access
		NULL, // no security attributes
		OPEN_EXISTING, // comm devices must use OPEN_EXISTING
		0,    // not overlapped I/O
		NULL  // hTemplate must be NULL for comm devices
		);

	if (hCom == INVALID_HANDLE_VALUE)
	{
		dwError = GetLastError();
		return;

		// handle error
	}

	// Omit the call to SetupComm to use the default queue sizes.
	// Get the current configuration.

	fSuccess = GetCommState(hCom, &dcb);

	if (!fSuccess)
	{
		// Handle the error.
		CloseHandle(hCom);
		return;
	}

	// Fill in the DCB: baud=1200, 8 data bits, no parity, 1 stop bit.

	dcb.BaudRate = CBR_1200;
	dcb.ByteSize = 8;
	dcb.Parity = NOPARITY;
	dcb.StopBits = ONESTOPBIT;

       dcb.fAbortOnError = FALSE;
       dcb.fInX = FALSE;
       dcb.fOutX = FALSE;
       dcb.fOutxCtsFlow = FALSE;
       dcb.fOutxDsrFlow = FALSE;
       dcb.fDsrSensitivity = FALSE;
       dcb.fTXContinueOnXoff = FALSE;
       dcb.fRtsControl = RTS_CONTROL_ENABLE;
       dcb.fDtrControl = DTR_CONTROL_DISABLE;


	fSuccess = SetCommState(hCom, &dcb);

	if (!fSuccess)
	{
		// Handle the error.
		CloseHandle(hCom);
		return;
	}
	unsigned long leidos,total;

	COMMTIMEOUTS ct;
	memset(&ct,0,sizeof(COMMTIMEOUTS));
//	ct.ReadIntervalTimeout=MAXDWORD;
//	ct.ReadTotalTimeoutMultiplier=0;
//	ct.ReadTotalTimeoutConstant=0;
	SetCommTimeouts(hCom,&ct);
    COMSTAT ComStatNew;
	DWORD dwErrors;

	total=0;
	char rxchar;
	while(!_kbhit())
	{
		leidos=0;
		while(!leidos && !_kbhit()){
				fSuccess=ReadFile(hCom,&rxchar,1,&leidos,NULL);
		}
		if(fSuccess)
		{
			total+=leidos;
			cadena[leidos]='\0';
			printf("%d,\n",rxchar);

		}
	}

	CloseHandle(hCom);
}


felices fiestas!

_________________________________________________________________
Windows Live Messenger, la nueva generación de tu MSN. 
http://imagine-msn.com/minisites/messenger/default.aspx?locale=es-ar





Más información sobre la lista de distribución Cconclase