 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Mar 23 Mar, 2004 6:54 pm Asunto: protocolo GPS |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mie 24 Mar, 2004 2:28 am Asunto: |
|
|
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 |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Mie 24 Mar, 2004 5:58 pm Asunto: |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mie 24 Mar, 2004 7:06 pm Asunto: |
|
|
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 |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Mie 24 Mar, 2004 7:26 pm Asunto: |
|
|
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 |
|
 |
Invitado
|
Publicado: Mie 24 Mar, 2004 8:31 pm Asunto: |
|
|
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 |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Mie 24 Mar, 2004 8:48 pm Asunto: |
|
|
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 |
|
 |
j.e.a. Invitado
|
Publicado: Jue 25 Mar, 2004 1:51 pm Asunto: GPS |
|
|
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 |
|
 |
Picard Master


Registrado: 18 Ene 2004Mensajes: 218Ubicación: Palamos (Girona) España
|
Publicado: Dom 28 Mar, 2004 12:04 pm Asunto: |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Lun 29 Mar, 2004 9:35 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|