Digamos que tenho algumas variáveis que quero imprimir no terminal. Qual é a maneira mais fácil de imprimi-las em uma string?
Atualmente eu faço algo assim:
Serial.print("Var 1:");Serial.println(var1);
Serial.print(" Var 2:");Serial.println(var2);
Serial.print(" Var 3:");Serial.println(var3);
Existe uma maneira melhor de fazer isso?
Respostas:
ardprintf
é uma função que eu cortei junto que simulaprintf
através da conexão serial. Esta função (fornecida na parte inferior) pode ser colada no início dos arquivos em que a função é necessária. Não deve criar conflitos.Pode ser chamado de semelhante a
printf
. Veja em ação neste exemplo:A saída conforme o esperado é:
O protótipo da função é:
Retorna o número de argumentos detectados na chamada de função.
Esta é a definição da função:
** Para imprimir o
%
caractere, use%%
. *Agora, disponível nas listas principais do Github .
fonte
Eu normalmente não colocar duas respostas a uma pergunta, mas eu só encontrei apenas este hoje, onde você pode usar printf sem buffer.
Isso ainda tem a limitação de ponto flutuante.
edit: Eu pensei em fazer um pequeno teste sobre isso, e funciona muito bem. Eu adicionei um teste melhor ao loop com saída formatada.
fonte
serial_putchar
função, por que não fazer a declaração de retornoreturn !Serial.write(c);
? Não é mais limpo que um operador trinário por inverter a sensação de um valor de retorno booleano?serial_putchar
função. Isso funciona um prazer. :-) Você pode corrigir a limitação do ponto flutuante ?Provavelmente não é melhor, apenas diferente. Você pode usar o objeto String para saída. Esses objetos permitem concatenação e suportam a conversão automática de tipos.
fonte
Eu geralmente usava guias para tornar as coisas mais alinhadas no Serial. Tendo as coisas alinhadas como eu, permitirei que o arduino seja disparado o mais rápido possível, ao mesmo tempo em que percebo certas alterações nas variáveis.
Tente algo como isto:
Ou algo parecido com isto:
fonte
Eu só uso isso para depuração, mas:
fonte
Sou novato no mundo do Arduino, mas recentemente descobri que este é apenas um C ++ regular (sem exceções e provavelmente polimorfismo). Mas você ainda pode desfrutar de modelos. Portanto, minha solução é usar os seguintes modelos:
O legal aqui é que ele não usa nenhuma memória e processamento extra aqui.
fonte
Eu costumo (dolorosamente) ficar com várias linhas de
Serial.print
mas, quando fica complicado, eu volto parasprintf
. É irritante porque você precisa ter um buffer disponível para isso.O uso é tão simples (??) quanto:
Uma palavra de aviso, porém, (por padrão) não suporta tipos flutuantes.
fonte
Usando
Streaming.h
, no lugar dealguém pode escrever
A definição de
<<
naStreaming.h
verdade traduz isso em uma série deSerial.print()
chamadas comuns . Ou seja,<<
é o açúcar sintático, implementado sem aumentar o tamanho do código.Se você não tiver
Streaming.h
instalado, começarStreaming5.zip
a partir arduiniana.org . Descompacte-o no diretório de bibliotecas, por exemplo, em~/sketchbook/libraries
. Adicione a linha#include <Streaming.h>
nos esboços onde você usa<<
como operador de fluxo.Os especificadores de conversão base _HEX, _DEC, _OCT e _BIN são fornecidos, bem como uma função _FLOAT (com número de casas decimais) e
endl
. Por exemplo, para imprimir valores de latitude e longitude em um formato como "Suas coordenadas são -23.123, 135.4567", pode-se escrever:Isso também pode ser escrito como
que manteria a seqüência mais longa no PROGMEM em vez de trazê-la para a RAM.
Observe
Streaming.h
que não cria nenhuma string como tal; apenas entrega o texto de seus<<
argumentos a um fluxo. Uma classe PString na arduiniana pode construir cadeias de caracteres de entradas de fluxo, se forem desejadas ou necessárias cadeias em vez de saída de fluxo.fonte
O uso dependerá do tipo de dados de suas variáveis.
Se eles são
int
, seria%d
ou%i
Se sãostring
, seria%s
Wrapper para impressãof
Você pode alterar o limite com base em seus requisitos
Fonte: https://playground.arduino.cc/Main/Printf
Exemplos de uso:
ESP8266
É incorporado na
Serial
classe da estrutura. Não há necessidade de biblioteca ou função adicional.Mais detalhes sobre dicas de formatação na página de referência do formato printf: http://www.cplusplus.com/reference/cstdio/printf/
\n
é a sequência de escape para o avanço de linha.Fonte: http://en.cppreference.com/w/cpp/language/escape
[EDIT] - Como o @Juraj mencionou, ele não está disponível na maioria dos módulos do AVR. Então eu adicionei a menção ESP8266 e um wrapper printf para módulos AVR comuns
fonte
Uma solução possível é:
Serial.println((String)"Var 1:" + var1 + " Var 2:" + var2 + " Var 3:" + var3);
fonte
De http://playground.arduino.cc/Main/Printf , observei que isso está funcionando bem no meu mega2560
É tudo o que funcionou, não há necessidade de vsnprintf_P ou PROGMEM ...
fonte
printf()
si próprio ?Você verá no terminal:
fonte
+
operador.