Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

protocolo GPS

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: protocolo GPS Responder citando

Asunto modificado, favor de ser más precisos en el mismo


Por favor ya no se que hacer,he mirado cientos de paginas y no hay manera dee encontrar nada al respecto.
con el siguiente codigo si no tengo cobertura del gps leo cadenas,pero vacias,pero en cuanto tengo cobertura del gps no me las lee
Código:
void __fastcall TRead::DisplayIt()
{
       //Muestra las cadenas recibidas.
       frmPrincipal->Flujodedatos->SetSelTextBuf(InBuff);
       AnsiString strInBuff = AnsiString(InBuff);
        int pos = strInBuff.Pos(",");
       AnsiString resto = strInBuff.SubString(pos +1, strInBuff.Length()-pos-1);
       pos = resto.Pos(",");
       Latitud = resto.SubString(1,pos -1);
       Longitud = resto.SubString(1,pos - 1 );
       Velocidad = resto.SubString(1, pos -1);
       Rumbo = resto.SubString(1, pos -1);
       // Teniendo ya en pos la posición de la primera coma 
       AnsiString tipoCadena = strInBuff.SubString(1, pos - 1);
       //Con este codigo los label "lat y long" deben mostrar latitud y longitud
       // recibidos por el puerto serie

           if(!Latitud.Trim().Length());
              frmPrincipal->lblLatPos->Caption = "Sin datos";
           if(tipoCadena == "$GPRMC")
               frmPrincipal->lblLatPos->Caption = Latitud;
           if(!Longitud.Trim().Length())
              frmPrincipal->lblLongPos->Caption = "desde el gps";
           if(tipoCadena == "$GPRMC")
              frmPrincipal->lblLongPos->Caption = Longitud;
           if(!Velocidad.Trim().Length())
              frmPrincipal->lblVelPos->Caption = "- - -";
           if(tipoCadena == "$GPRMC")
               frmPrincipal->lblVelPos->Caption = Velocidad;
           if(!Rumbo.Trim().Length())
              frmPrincipal->lblRumboPos->Caption = "- - -";
           if(tipoCadena == "$GPRMB")
               frmPrincipal->lblLatPos->Caption = Rumbo;
}
o sea que me dice sin datos desde el gps y ___ ___, exactamente lo que deberia decirme cuando las cadenas estan vacias
_________________
El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, Picard, hay ciertas sentencias que no acabo de comprender en tu código:
Código:
       Latitud = resto.SubString(1,pos -1);
       Longitud = resto.SubString(1,pos - 1 );
       Velocidad = resto.SubString(1, pos -1);
       Rumbo = resto.SubString(1, pos -1);

Al no actualizar ni pos ni resto todas las variables toman el mismo valor, esto hace además que
Código:
(!Latitud.Trim().Length());
sea siempre 0 o siempre 1, aunque cambies el nombre de la variable.
Código:
       AnsiString tipoCadena = strInBuff.SubString(1, pos - 1);
       ...
           if(tipoCadena == "$GPRMC")
               frmPrincipal->lblLatPos->Caption = Latitud;
Si ya sabes que tipoCadena tiene 6 caracteres no necesitas usar pos para extraerla de strInBuff.

Haces muchas veces la pregunta
Código:
           if(tipoCadena == "$GPRMC")
cuando con una sóla tendrías un código más eficiente, algo así como
Código:
           if(tipoCadena == "$GPRMC")
               {
               frmPrincipal->lblLatPos->Caption = Latitud;
               frmPrincipal->lblLongPos->Caption = Longitud;
               frmPrincipal->lblVelPos->Caption = Velocidad;
               frmPrincipal->lblLatPos->Caption = Rumbo;
               }
           else
               {
               frmPrincipal->lblLatPos->Caption = "Sin datos";
               frmPrincipal->lblLongPos->Caption = "desde el gps";
               frmPrincipal->lblVelPos->Caption = "- - -";
               frmPrincipal->lblRumboPos->Caption = "- - -";
               }

¿Estás completamente seguro de que InBuff contiene la información que intentas leer?

Suerte
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perdon enrique a veces me pierdo en mi pripia ignorancia,veras te cuento:
Por InBuff recibo desde el puerto serie,recibo cadenas nmea desde un gps,o sea que recibo unas cadenas que cada 8 se repiten,la primera subcadena ya que el contenido (latitud,longitud,rumbo y velocidad van cambiando) asi que al hacer :
Código:
 if(tipoCadena == "$GPRMC")
               frmPrincipal->lblLatPos->Caption = Latitud;

lo que intento hacer es tomar solo informacion de esa cadena,en este caso la latitud,
lo que me preocupa es que he probado a ir cambiando los indices en:
Código:
Latitud = resto.SubString(8,pos -13);
       Longitud = resto.SubString(12,pos - 9 );
       Velocidad = resto.SubString(14, pos -13);
       Rumbo = resto.SubString(16, pos -14);

y sin cobertura en el gps veo informacion,como la hora utc o las subcadenas vacias y cuando el gps recibe datos reales no visualizo nada.,procurare ser mas claro al escribir el codigo.o al menos ser mas coherente a la hora de hacerlo
muchisimas gracias
_________________
El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, Picard, lo primero que no tengo claro es
Código:
       //Muestra las cadenas recibidas.
       frmPrincipal->Flujodedatos->SetSelTextBuf(InBuff);

¿qué es Flujodedatos? ¿un TMemo? ¿TEdit? ¿...?

Deberías depurar tu programa deteniéndolo después de esa sentencia y comprobando que realmente se escribe en Flujodedatos lo que tú crees que se va a escribir. Si no tienes claro cómo hacerlo puedes poner un ShowMessage(strInBuff); después de la siguiente sentencia.

Además no te interesa hacer las asignaciones de Latitud, ... hasta que no detectas que strInBuff comienza con el texto que te indica que las estás leyendo.

Otro detalle es que si InBuff recibe más líneas de información, quizá en algún momento se lea correctamente la que comience por "$GPRMC", pero al leer la siguiente línea se borrará el contenido de Latitud, ... Entonces tu código no debería hacer esas asignaciones en cada momento, sólo cuando sepas que van a ser válidas. Lo de poner "Sin datos ..." deberías manejarlo desde otro punto de vista, por ejemplo cuando detectes que InBuff está vacío, ...

Suerte.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perdon otra vez,pero es que este tema me esta desquiciando,llevo ya con lo mismo mas de un mes,
en efecto flujodedatos en un objeto TMemo,en el visualizo todo lo que entra por el puerto serie,y lo que entra es esto:
Código:
$GPGLL,4151.249,N,00317.047,E,091326,A*2D
$GPRMB,V,,,,,,,,,,,þ*6ö
$GPRMC,091326,A,4151.249,N,00317.047,E,002.0,291,230204,000,E*7E
$GPVTG,274,T,274,M,001.9,N,003.5,K*40
$GPAAM,V,V,,N,*38
$GPAPB,A,A,,,N,V,V,,M,,,M,,M*47
$GPBWC,091328,,,,,,T,,M,,N,*17
$GPGGA,091328,4151.249,N,00317.046,E,1,04,03.0,-0022,M,50,M,,*65
$GPGLL,4151.249,N,00317.046,E,091328,A*22
$GPRMB,V,,,,,,,,,,,,V*66
$GPRMC,091329,A,[color=red]4151.249,N,00317.045,E[/color],[color=green]001.9,[/color][color=blue]282[/color],230204,000,E*7B
$GPVTG,282,T,282,M,001.9,N,003.6,K*43
$GPAAM,V,V,,N,*38
$GPAPB,A,A,,,N,V,V,,M,,,M,,M*47
$GPBWC,091330,,,,,,T,,M,,N,*1E
$GPGGA,091330,4151.249,N,00317.044,E,1,04,03.0,-0022,M,50,M,,*6E
$GPGLL,4151.249,N,00317.043,E,091331,A*2F
$GPRMB,V,,,,,,,,,,,,V*66
$GPRMC,091331,A,4151.249,N,00317.043,E,002.1,277,230204,000,E*75
$GPVTG,296,T,296,M,002.1,N,003.9,K*47

como ves las cadenas se repiten,pero con datos distintos,de la cadena $GPRMC quiero obtener la latitud y la longitud que son las posiciones marcadas en rojo,la velocidad que son las posiciones marcadas en verde y el rumbo que es la posicion en azul.gracias
_________________
El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, una posible solución es la siguiente:
Código:
void __fastcall TRead::DisplayIt()
{
       //Muestra las cadenas recibidas.
       frmPrincipal->Flujodedatos->SetSelTextBuf(InBuff);
       AnsiString strInBuff = AnsiString(InBuff);
       int pos;

       if(strInBuff.SubString(1, 6) == "$GPRMC")
         {
         //Quitamos la etiqueta
         strInBuff = strInBuff.SubString(7, strInBuff.Length() - 7);
         //Primera coma, no me interesa el dato    //091329
         pos = strInBuff.Pos(",");
         strInBuff = strInBuff.SubString(pos +1, strInBuff.Length()-pos-1);
         //Segunda, lo mismo                       //A
         pos = strInBuff.Pos(",");
         strInBuff = strInBuff.SubString(pos +1, strInBuff.Length()-pos-1);
         //Tercera, ahora aparece la ¿latitud?     //4151.249
         pos = strInBuff.Pos(",");
         frmPrincipal->lblLatPos->Caption = strInBuff.SubString(1, pos - 1);
         strInBuff = strInBuff.SubString(pos +1, strInBuff.Length()-pos-1);
         //Ahora viene una N ¿latitud tb? (se lo añado a Latitud)
         pos = strInBuff.Pos(",");
         frmPrincipal->lblLatPos->Caption = Latitud + strInBuff.SubString(1, pos - 1);
         strInBuff = strInBuff.SubString(pos +1, strInBuff.Length()-pos-1);
         //
         ...
         }
}

Lo que no te sugiero es que pongas en esta función lo de "Sin datos ...", creo que debes gestionarlo en otro lugar del programa, donde rellenes la variable InBuff, ,p.ej., si durante cierto tiempo no se reciben datos. De lo contrario cada vez que lea una línea que no comience por "$GPRMC" te creerás que no se están recibiendo datos.

Suerte.
Volver arriba
Mensaje    Asunto: Responder citando

Gracias Enrique por tus innumerables ayudas,
_________________
El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: GPS Responder citando

Hola:

No se si te podre ayudar, yo trabajo programando microprocesadores a bajo nivel y un periferico frecuente es el gps. No se si has tenido en cuenta que la trama no tiene siempre el mismo tamaño, que si el gps se nueve la parte de la velocidad te la da de con un numero de caracteres distinto y que la parte del rumbo tambien te cambia en numero de caracteres. Lo unico que es constante son los campos entre comas.

Un saludo
Volver arriba
Mensaje    Asunto: Responder citando

No se que pasa,pero no consigo mantener el TLabel visible por tiempo indefinido, da la informacion casi correctamente,pero se oculta y no muestra nada ni poniendo el codigo en un TTimer ni en ninguna parte mas
_________________
El hombre es el unico ser que tropieza dos veces en la misma piedra ( en mi caso infinitas veces)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, Picard, no desesperes y razona porqué desaparece la información de tus etiquetas pues eres tú quien cambia el valor de su propiedad Caption.

Si quieres que muestre una información actualizada tendrás que actualizarlo, y ahí está el riesgo: si no recibes nueva información de posición de tu GPS no puedes escribirla y has de decidir: dejo la posición anterior o la borro (por si ya es obsoleta). Quizá te interese cambiar de color (en vez de borrarla) cuando llevas un rato sin recibir datos, o ..., cualquier truco que se te ocurra.

Medita un poco en este sentido porque sólo tú entiendes y decides tu propio código.

Suerte.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.