Processing math: 100%

1 votos

Arduino Mega y el envío de datos a través de serial3.print()

Hasta ahora lo he hecho:

float temp = 22.45;  
Serial3.print(temp + "\r");  

Sabía que ese código no funcionaría desde el principio.
Estoy intentando concatenar el temp y un retorno de carro. La placa con la que me voy a comunicar sólo acepta un retorno de carro al final y no una nueva línea, de lo contrario habría utilizado un println(). ¿Cómo puedo combinar el valor de la variable y un retorno de carro y enviarlo a través de Serial3?

EDITAR

char tempAr[10];
String tempAsString;
String serialData;

dtostrf(temp,1,2,tempAr);
tempAsString = String(tempAr);

serialData = tempAsString + "\r";
Serial3.print(serialData);

El código anterior parece funcionar; sin embargo, todavía es tosco y tendré que cambiar los valores de anchura y precisión en el dtostrf por lugar decimal (unos, decenas, centenas);

1voto

Jedidja Puntos 5642

El comentario de bjthom parece muy sencillo, pero si eso no es una opción para ti, ¿qué tal si sprintf ?

float const val = 22.45;
char buf[64];
sprintf(buf, "%f\r", val);
Serial3.print(buf);

Actualización

Tienes razón, sprintf es un potencial cuello de botella. Aquí hay una función mucho más eficiente que evita el uso del String clase:

char * ftoa_wr(float f, char * a, int precision=2)
{
  char * const ret = a;
  long const bp = (long)f;
  itoa(bp, a, 10);
  while(*a != '\0') a++;
  *a++ = '.';
  long const ap = abs(
    (long)(
      (f - bp) * pow(10, precision)
    )
  );
  itoa(ap, a, 10);
  while(*a != '\0') a++;
  *a++ = '\r';
  return ret;
}

Con él se puede hacer

char buf[10];
Serial3.print(ftoa_wr(22.45, buf));

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X