Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Como podéis ver aquí los datos llegan y además correctamente, pero a veces se desalinean:
No veo la necesidad de poner correctores de bits. Además no consigo mejorarlo nada poniendo timeouts distintos al puerto serie.
Este es el codigo C++ que he usado para la recepción:
#include <windows.h>
#include <stdio.h>
#include <time.h>
#define TIEMPO 40 //segundos
#define IMPRIME 1
int main()
{
HANDLE
hCom1=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0),
hCom2=CreateFile("COM6",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 2; //250ms Windows!!!!!!!
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;
if (!SetCommTimeouts(hCom1, &timeouts)) { printf("nError timeout puerto-1 con error: %d", GetLastError());getchar();getchar(); return-1;}
if (!SetCommTimeouts(hCom2, &timeouts)) { printf("nError timeout puerto-2 con error: %d", GetLastError());getchar();getchar(); return-1;}
SetupComm(hCom1,4048,4048);
SetupComm(hCom2,4048,4048);
DCB dcb;
ZeroMemory(&dcb,sizeof(dcb));
dcb.DCBlength=sizeof(dcb);
dcb.BaudRate = CBR_38400; // baud rate
dcb.ByteSize = 8; // data size, xmit and rcv
dcb.Parity = NOPARITY; // parity bit
dcb.StopBits = ONESTOPBIT; // stop bit
if (SetCommState(hCom1,&dcb)) printf("nAbierto puerto-1");
else { printf ("nFalla SetCommState en puerto-1 con error: %d", GetLastError());getchar();getchar(); return-1;}
if (SetCommState(hCom2,&dcb)) printf("nAbierto puerto-2");
else { printf ("nFalla SetCommState en puerto-2 con error: %d", GetLastError());getchar();getchar(); return-1;}
DWORD res;
unsigned char dato2[4048];
long paquetes,bytes,bitsfail;
long i,j;
for (i=0;i<5;i++)
{
long ini=clock();
long fin=ini+(long) (CLOCKS_PER_SEC*TIEMPO),tiempo=0;
printf("nEsperar %li segundos",TIEMPO);
paquetes=bytes=bitsfail=0;
while (tiempo<fin)
{
tiempo=clock();
ReadFile( hCom2,dato2,11,&res,NULL);
bytes+=res;
if (bytes>=5)
{
paquetes+= bytes / 5;bitsfail+= bytes % 5;bytes=0;
}
if ((res>0)&&IMPRIME)//>0
{
printf("n");
for (j=0;j<res;j++) printf("%02X ", dato2[j]);
}
}
printf("nRecibidos %li paquetes",paquetes);
printf("nTiempo de llegada= %lg ms",(1.0*CLOCKS_PER_SEC*TIEMPO/paquetes));
printf("nRecibidos %li bits mal",bitsfail);
}
CloseHandle(hCom1);
CloseHandle(hCom2);
printf("n===FIN===");
getchar();
getchar();
return 0;
}
¿Como puedo evitar el error del desalineamiento?
saludos
Me gustaría mandar datos de un GPS a mi PC y que aparezca la posición en google maps, aunque aun estoy algo lejos de eso 🙂
El segundo lo usé para escribir mi código 🙂
En el primer caso hace lo mismo que yo, pero me gustaría que hubiera otra fución que me diga si hay datos en el COM antes de sacarlos, pues no quiero usar un buffer intermedio pues las veces que lo he hecho me ha ido fatal y le tengo yuyu
¿Qué librerías usas para C++?
Lo digo porque seguramente tienen una clase específica para el puerto serie y alli habrá todo lo que necesitas (mejor que GenericFile).
S2
Ranganok Schahzaman
PD: por cierto, en mis tiempos de programador de C++ el header <windows.h> solía dar bastantes problemas, creo recordar (hace muchos años) que lo substituia por <win32.h> o algo así, aunque aquí quizás sería mejor meter el sdk de .NET
Yo ahora no tengo nada en C++ para desarrollar, no te puedo ayudar más.
Si fuera en Java, ya podría echarte una mano ya que toda la parte del serial lo hice para el programa TestIMU.
OK, gracias.
Estoy usando visual C++6.0, aunque creo he de migrar a versiones más modernas para cuando cambie el SO a win7 🙁
Miraré lo del win32.h.
Saludos.