Cómo construir (concat) una cadena con números grandes

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

Ahora quiero concatizar una cadena que puedo procesar (lea: quiero enviarlo a través de un cliente ethernet). Esto es lo que ya tengo:

...... String vnnt = "$VNNT,"; if (GPS.fix) { vnnt += "GPS,"; //this works: vnnt.concat(GPS.fix); //but this not: vnnt.concat(GPS.latitude); }else{ vnnt += "INFO,Acquiring Sats"; } Serial.println(vnnt); 

El mensaje de error es: Call of overloaded "concat(float&)" is ambiguous Cuando Serial.print(GPS.latitude, DEC) da como resultado: 4418.5937996050

Entonces es probablemente demasiado grande o algo …

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

Comentarios

  • Aren ' ¿No le falta un punto y coma?
  • y uno dice vnnt mientras que otro dice vannut
  • Perdón por algún error tipográfico ' s 🙂
  • ¿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í?

Answer

La función concat no implementa una versión flotante, pero algunos 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 () y luego concatizar tu cadena.

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

o

dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs 

Y luego:

vnnt.concat(outstr) 

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

char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude); 

Comentarios

  • +1 en caso de duda, sprintf 🙂
  • Sin embargo, un punto de precaución: sprintf() es una función compleja, por lo que es bastante lento y usa bastante memoria. Generalmente, lo evitaría para el código de " producción " (solo para fines de depuración).
  • Eso es un buen punto @jfpoilpret, no lo 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 conjunto generado. Con respecto a sscanf, IIRC tiene algunas limitaciones (creo que con números de coma flotante).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *