[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