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
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).
vnnt
mientras que otro dicevannut
GPS.latitude
? P.ej. ¿Es unfloat
,int
, etc.?