Pregunta:
Cómo construir (concat) una cadena con números grandes
stUrb
2014-03-21 03:39:52 UTC
view on stackexchange narkive permalink

nuevo en arduino Estoy luchando con lo que suena como un problema bastante n00b ... He conectado una placa GPS adafruit a mi Arduino y está funcionando ya que escupe datos de GPS al puerto serie con Serial.print (GPS.latitude, DEC)

Ahora quiero concat una cadena que pueda procesar (léase: quiero enviarla a través de un cliente ethernet). Esto es lo que Ya tengo:

  ...... String vnnt = "$ VNNT,"; if (GPS.fix) {vnnt + = "GPS,"; // esto funciona: vnnt.concat (GPS.fix); // pero esto no: vnnt.concat (GPS.latitude);} else {vnnt + = "INFO, Acquiring Sats";} Serial.println (vnnt);  

El mensaje de error is: La llamada de 'concat (float&)' sobrecargada es ambigua Cuando Serial.print (GPS.latitude, DEC) da como resultado: 4418.5937996050

Así que probablemente sea demasiado grande o algo ...

¿Cómo puedo concaminar las vars y crear la cadena larga?

¿No te falta un punto y coma?
y uno dice "vnnt" mientras que otro dice "vannut"
Lo siento, algunos errores tipográficos :)
¿Conoce el tipo de datos de `GPS.latitude`? P.ej. ¿Es un `float`,` int`, etc.?
Creo que es un flotador. Dice flotar en el mensaje de error. ¿Cómo puedo averiguarlo? ¿Hay un var_dump o algo así?
@stUrb Me las arreglé para buscarlo en la biblioteca de GPS, y de hecho es un flotador.
@stUrb, puede comprobar que en realidad es un flotante en el código, en la carpeta que descargó, en línea aquí: https://github.com/adafruit/Adafruit-GPS-Library/blob/master/Adafruit_GPS.h
One responder:
#1
+7
drodri
2014-03-21 03:52:25 UTC
view on stackexchange narkive permalink

La función concat no implementa una versión flotante, pero algo de char, int, unsigneds ...

  unsigned char String :: concat (long unsigned int) unsigned char String :: concat (unsigned int) unsigned char String :: concat (int) ...  

por lo que el compilador no sabe cómo convertir (truncando probablemente el flotante) a un entero, ya que hay varios opciones.

Primero tienes que convertir tu flotante en cadena, usar dtostrf () o sprintf () luego concat a tu cadena.

  char outstr [25]; sprintf (out , "% f", GPS.latitude);  

o

  dtostrf (GPS.latitude, 6, 2, out); // verifique los documentos para 6, 2 valores y configúrelos para sus necesidades  

Y luego:

  vnnt.concat (out)  

También tenga en cuenta que sprintf es muy útil para la creación compacta de una cadena (char):

  char msg [80]; sprintf (msg, "$ VNNT, GPS, % s% f ", GPS.fix, GPS.latitude);  
+1 en caso de duda, `sprintf` out :)
Sin embargo, un punto de precaución: `sprintf ()` es una función compleja, por lo tanto, es bastante lenta y usa bastante memoria. Generalmente, lo evitaría para el código de "producción" (solo lo mantendría con fines de depuración).
Ese es un buen punto @jfpoilpret, que no tomé en cuenta. ¿Tiene algún orden de magnitud de eficiencia frente a una versión dtostrf + concat? ¿Se aplica lo mismo a sscanf ()? (por cierto, ahora dudo que sscanf () realmente funcione bien en arduino)
No realicé mediciones reales para comparar ambas llamadas, pero supongo que uno podría simplemente echar un vistazo al código C y posiblemente verificar el ensamblaje generado. Con respecto a `sscanf`, IIRC tiene algunas limitaciones (creo que con números de coma flotante).


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...