Digamos que tengo algunas variables que quiero imprimir en la terminal, ¿cuál es la forma más fácil de imprimirlas en una cadena?
Actualmente hago algo como esto:
Serial.print("Var 1:");Serial.println(var1);
Serial.print(" Var 2:");Serial.println(var2);
Serial.print(" Var 3:");Serial.println(var3);
¿Hay una mejor manera de hacer esto?
Respuestas:
ardprintf
es una función que pirateé juntos que simulaprintf
la conexión en serie. Esta función (dada en la parte inferior) se puede pegar al comienzo de los archivos donde se necesita la función. No debe crear ningún conflicto.Se le puede llamar similar a
printf
. Véalo en acción en este ejemplo:La salida como se espera es:
El prototipo de la función es:
Devuelve el número de argumentos detectados en la llamada a la función.
Esta es la definición de la función:
** Para imprimir el
%
personaje, use%%
. *Ahora, disponible en Github Gists .
fuente
Normalmente no pondría dos respuestas a una pregunta, pero acabo de encontrar esto hoy, donde puedes usar printf sin ningún búfer.
Esto todavía tiene la limitación de coma flotante.
editar: pensé que haría una pequeña prueba en esto, y funciona bastante bien. Agregué una mejor prueba al bucle con salida formateada.
fuente
serial_putchar
función, ¿por qué no hacer la declaración de devoluciónreturn !Serial.write(c);
? ¿No es eso más limpio que un operador trinario para invertir el sentido de un valor de retorno booleano?serial_putchar
funcion. Funciona de maravilla. :-) ¿Puedes arreglar la limitación de coma flotante ?Esto probablemente no sea mejor, solo diferente. Puede usar el objeto String para la salida. Estos objetos permiten la concatenación y admiten el encasillado automático.
fuente
Por lo general, usaba pestañas para hacer que las cosas se alineen mejor en la serie. Hacer que las cosas se alineen como yo permite que el arduino dispare lo más rápido posible al tiempo que puede notar ciertos cambios en las variables.
Intenta algo como esto:
O algo como esto:
fuente
Solo uso esto para depurar pero:
fuente
Soy un novato en el mundo de Arduino, pero recientemente descubrí que esto es solo un C ++ normal (sin excepciones y probablemente polimorfismo). Pero aún puedes disfrutar de las plantillas. Entonces mi solución es usar las siguientes plantillas:
Lo bueno aquí es que no usa memoria adicional ni procesamiento adicional aquí.
fuente
Por lo general (dolorosamente) me quedo con varias líneas de
Serial.print
pero cuando se vuelve complicado vuelvo asprintf
. Es molesto porque tienes que tener un búfer disponible para ello.El uso es tan simple (??) como:
Sin embargo, una advertencia: no admite (por defecto) los tipos flotantes.
fuente
Usando
Streaming.h
, en lugar deuno puede escribir
La definición de
<<
enStreaming.h
efecto traduce eso en una serie deSerial.print()
llamadas ordinarias . Es decir,<<
es un azúcar sintáctico, implementado sin aumentar el tamaño del código.Si no lo ha
Streaming.h
instalado, obtengaStreaming5.zip
de arduiniana.org . Descomprímalo en su directorio de bibliotecas, por ejemplo en~/sketchbook/libraries
. Agregue la línea#include <Streaming.h>
dentro de los bocetos que usa<<
como operador de flujo.Se proporcionan los especificadores de conversión de base _HEX, _DEC, _OCT y _BIN, así como una función _FLOAT (con número de lugares decimales) y
endl
. Por ejemplo, para imprimir valores de latitud y longitud en una forma como "Sus coordenadas son -23.123, 135.4567" se podría escribir:Esto también podría escribirse como
que mantendría la cadena más larga en PROGMEM en lugar de llevarla a la RAM.
Tenga en cuenta
Streaming.h
que no crea ninguna secuencia como tal; solo entrega el texto de sus<<
argumentos a una secuencia. Una clase PString en arduiniana puede construir cadenas a partir de entradas de flujo, si se desean o necesitan cadenas en lugar de una salida fluida.fuente
El uso dependerá del tipo de datos de sus variables.
Si lo son
int
, sería%d
o%i
si lo fueranstring
, sería%s
Envoltorio para imprimir
Puede cambiar el límite según sus requisitos.
Fuente: https://playground.arduino.cc/Main/Printf
Ejemplos de uso:
ESP8266
Está integrado en la
Serial
clase del marco. No hay necesidad de biblioteca o función adicional.Más detalles sobre consejos de formato en la página de referencia del formato printf: http://www.cplusplus.com/reference/cstdio/printf/
\n
es la secuencia de escape para el avance de línea.Fuente: http://en.cppreference.com/w/cpp/language/escape
[EDITAR] - Como mencionó @Juraj, no está disponible en la mayoría de los módulos AVR. Así que agregué la mención ESP8266 y un contenedor printf para módulos AVR comunes
fuente
Una posible solución es:
Serial.println((String)"Var 1:" + var1 + " Var 2:" + var2 + " Var 3:" + var3);
fuente
Desde http://playground.arduino.cc/Main/Printf observé que esto funciona bien en mi mega2560
Eso es todo lo que funcionó, no hay necesidad de vsnprintf_P o PROGMEM ...
fuente
printf()
solo ?Verás en la terminal:
fuente
+
operador.