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

1

Hasta ahora tengo:

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

Sabía que el código no funcionaría desde el getgo.
Estoy intentando concatenar la variable temp y un retorno de carro. La placa con la que me estaré comunicando solo aceptará un retorno de carro al final y no una nueva línea, de lo contrario habría usado un println (). ¿Cómo combino el valor flotante y un retorno de carro y lo envío a través de Serial3?

EDIT

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 irregular y tendré que cambiar los valores de ancho y precisión en el dtostrf por lugar decimal (unidades, decenas, centenas);

    
pregunta dottedquad

1 respuesta

1

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

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

Actualizar

Tienes razón, sprintf es un posible cuello de botella. Aquí hay una función mucho más eficiente que le permite evitar el uso de la clase String :

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 != '
char buf[10];
Serial3.print(ftoa_wr(22.45, buf));
') a++; *a++ = '.'; long const ap = abs( (long)( (f - bp) * pow(10, precision) ) ); itoa(ap, a, 10); while(*a != '
float const val = 22.45;
char buf[64];
sprintf(buf, "%f\r", val);
Serial3.print(buf);
') a++; *a++ = '\r'; return ret; }

Con eso podrías hacer

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 != '
char buf[10];
Serial3.print(ftoa_wr(22.45, buf));
') a++; *a++ = '.'; long const ap = abs( (long)( (f - bp) * pow(10, precision) ) ); itoa(ap, a, 10); while(*a != '%pre%') a++; *a++ = '\r'; return ret; }
    
respondido por el nijansen

Lea otras preguntas en las etiquetas