[C con Clase] puerto serie

Juan Antonio jalr43 en hotmail.com
Lun Dic 25 13:54:39 CET 2006


Hola Emiliano,

espero que hayas cenado bien y no te hayas parado mucho con esto, porque a
veces tenemos fallos muy tontos que al día siguiente se suelen ver bastante
rápido.

Lo primero e importante es si pretendes leer de tu periférico de una manera
síncrona (con un periodo de muestreo determinado) o asíncrona (leer de vez
en cuando y sin ninguna pauta temporal). Dentro de la función CreateFile
dice que para operaciones de entrada/salida asíncronas usar
FILE_FLAG_OVERLAPPED no como lo tienes ahora mismo. En la preguntas
frecuentes de conclase lo usan así
http://c.conclase.net/preguntas.php#seriewin , si va a ser síncrono pues
déjalo tal y como lo tienes y listo. Te dejo lo que dice la documentación:


FILE_FLAG_OVERLAPPED

The file is being opened or created for
asynchronous I/O. When the operation is complete, the event specified to the
call in the OVERLAPPED structure is set to the signaled state. Operations
that take a significant amount of time to process return ERROR_IO_PENDING.

If this flag is specified, the file can be used for simultaneous read
and write operations. The system does not maintain the file pointer,
therefore you must pass the file position to the read and write functions in
the OVERLAPPED structure or update the file pointer.

If this flag is not specified, then I/O operations are serialized,
even if the calls to the read and write functions specify an OVERLAPPED
structure.



Mejor que usar el kbhit puedes añadir eventos y que se te  notifique cuando
ocurra. Creo que te has apoyado en el ejemplo de configurar el puerto dentro
del Using Communications Resources. Hay mismo tienes otro ejemplo con
eventos, Monitoring Communications Events. Puedes usar un evento de cuando
hayan datos en el buffer del puerto y así te olvidas, dentro de ese evento
ya los muestras en pantalla o haces lo requerido con ellos. También te
hablan de ello en el link de las preguntas frecuentes de arriba.

Como estás con pruebas es mejor que limpies un poco el código. Usa el
CreateFile, modifica únicamente las 4 variables importantes de al estructura
DCB (velocidad, tamaño en bytes, paridad y bits parada), añade los eventos y
haz lo opurtono cuando ocurran. Sigue el esquema de conclase.

Quizá si comentas más sobre el periférico se te pueda ayudar mejor. A mí no
me queda muy claro como se va a producir la serie de datos como salida y
menos que lo que salga tenga alguna relación con la tecla pulsada porque
sólo muestras el carácter leído con ReadFile.

Feliz navidad,
Juan Antonio.


----- Original Message ----- 
From: "Emiliano Nuñez" <emilianito en hotmail.com>
To: <cconclase en listas.conclase.net>
Sent: Sunday, December 24, 2006 10:13 PM
Subject: [C con Clase] puerto serie


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


_______________________________________________
Cconclase mailing list
Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net





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