[C con Clase] puerto serie

Jorge Luis Betancourt González mayragm en finlay.cmw.sld.cu
Jue Dic 28 02:02:49 CET 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
 
Hola Emiliano:

Mira en mi modesta opinión, puede que al tratarse de un control
remoto, así como otros dispositivos inalámbricos estos envían señales
periódicas para ver si el dispositivo está aún conecta o para
averiguar en que estado se encuentra el dispositivo, así por ejemplo
sucede con los dispositivos WiFi de redes, mi consejo es que depures
un poco más tu algoritmo y escribas una función o un código que te
permita «filtrar» lo leído desde el dispositivo, y entonces luego
pasárselo al selector de acciones que tengas planeado implementar, si
te hace más fácil cuando tienes todas las interrupciones (datos) que
te envía el dispositivo y que no son las lecturas de las teclas
presionadas ni nada de esto, así pues:

Mando -> Envía señal -> Procesar señal en busca de ->  entregar señal
al selector de acciones
                        datos inválidos FF, FD, o
                        FE,
slds

Emiliano Nuñez escribió:
> 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
>

- --
Jorge Luis Betancourt González
E-Mail: betancourt.jorge en gmail.com (home)
        mayragm en finlay.cmw.sld.cu (work/home)
G-Talk: betancourt.jorge en gmail.com (jabber)
Blog:   http://jorgelb.blogeasy.com
Phone:  ++(53)(32)59440
Linux User: 386271
[El conocimiento humano pertenece al mundo]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.4 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
 
iD8DBQFFkxe5/9sG/XUcjyYRAunoAKDbcazfWsSmRPypzt/Lh+NE5Sp/4QCfY4X8
21OuKyS3EOPpp+P4SA9GjGo=
=ASWR
-----END PGP SIGNATURE-----



-- 
Este mensaje ha sido analizado por MailScanner del Nodo Finlay, Camaguey, Cuba
en busca de virus y se considera que está limpio.





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