fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Pérdida de paquetes...
 
Avisos
Vaciar todo

Pérdida de paquetes trasmitiendo a 868MHz

9 Respuestas
3 Usuarios
0 Reactions
7,236 Visitas
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

Como podéis ver aquí los datos llegan y además correctamente, pero a veces se desalinean:
perdida%2520paquetes

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

Responder
8 respuestas
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

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

Responder
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 19 años

¿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

Responder
ave_fenix
Respuestas: 213
(@ave_fenix)
Estimable Member
Registrado: hace 16 años

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.

Responder
fusion
Respuestas: 391
Topic starter
(@fusion)
Ardero
Registrado: hace 17 años

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.

Responder
Página 2 / 2
Compartir: