Supposons que je souhaite imprimer certaines variables sur le terminal. Quel est le moyen le plus simple de les imprimer dans une chaîne?
Actuellement, je fais quelque chose comme ça:
Serial.print("Var 1:");Serial.println(var1);
Serial.print(" Var 2:");Serial.println(var2);
Serial.print(" Var 3:");Serial.println(var3);
Y a-t-il une meilleure manière de faire cela?
Réponses:
ardprintf
est une fonction que j'ai piratée ensemble et qui simuleprintf
une connexion série. Cette fonction (indiquée en bas) peut être collée au début des fichiers où elle est nécessaire. Cela ne devrait pas créer de conflits.Il peut être appelé similaire à
printf
. Voyez-le en action dans cet exemple:Le résultat attendu est:
Le prototype de fonction est:
Il retourne le nombre d'arguments détectés dans l'appel de fonction.
C'est la définition de la fonction:
** Pour imprimer le
%
caractère, utilisez%%
. *Maintenant, disponible sur Gistsub Gists .
la source
Normalement, je ne mettrais pas deux réponses à une question, mais je viens juste de trouver ceci aujourd'hui, où vous pouvez utiliser printf sans aucun tampon.
Cela a toujours la limitation en virgule flottante.
edit: Je pensais faire un peu de test à ce sujet, et cela fonctionne assez bien. J'ai ajouté un meilleur test à la boucle avec une sortie formatée.
la source
serial_putchar
fonction, pourquoi ne pas faire la déclaration de retourreturn !Serial.write(c);
? N'est-ce pas plus propre qu'un opérateur trinaire pour inverser le sens d'une valeur de retour booléenne?serial_putchar
fonction. Cela fonctionne un régal. :-) Pouvez-vous corriger la limitation en virgule flottante ?Ce n'est probablement pas mieux, mais différent. Vous pouvez utiliser l' objet String pour la sortie. Ces objets permettent la concaténation et prennent en charge la conversion automatique.
la source
J'utilisais généralement des onglets pour améliorer l'alignement dans la publication en série. Avoir les choses alignées comme si je permettais à l’arduino de se déclencher le plus rapidement possible tout en pouvant remarquer certains changements dans les variables.
Essayez quelque chose comme ça:
Ou quelque chose comme ça:
la source
Je ne l'utilise que pour le débogage mais:
la source
Je suis novice dans le monde Arduino, mais j'ai récemment découvert qu'il ne s'agissait que d'un C ++ standard (sans exceptions et probablement polymorphisme). Mais vous pouvez toujours profiter des modèles. Ma solution consiste donc à utiliser les modèles suivants:
La bonne chose ici est qu'il n'utilise pas de mémoire supplémentaire et de traitement supplémentaire ici.
la source
Je colle habituellement (douloureusement) à plusieurs lignes,
Serial.print
mais quand cela devient compliqué, je retourne àsprintf
. C'est embêtant dans la mesure où vous devez avoir un tampon disponible pour cela.L'utilisation est aussi simple (??) que:
Un mot d'avertissement cependant, il (par défaut) ne supporte pas les types flottants.
la source
Utilisation
Streaming.h
, à la place deon peut écrire
La définition de
<<
inStreaming.h
traduit en fait cela en une série d'Serial.print()
appels ordinaires . C'est-à-dire qu'il<<
s'agit d'un sucre syntaxique, mis en œuvre sans augmenter la taille du code.Si vous n'avez pas
Streaming.h
installé, procurez-vousStreaming5.zip
de arduiniana.org . Décompressez-le dans le répertoire de vos bibliothèques, par exemple, dans~/sketchbook/libraries
. Ajoutez la ligne#include <Streaming.h>
dans les esquisses où vous utilisez en<<
tant qu'opérateur de flux.Les spécificateurs de conversion de base _HEX, _DEC, _OCT et _BIN sont fournis, ainsi qu'une fonction _FLOAT (avec le nombre de décimales) et
endl
. Par exemple, pour imprimer les valeurs de latitude et de longitude dans un formulaire du type "Vos coordonnées sont -23.123, 135.4567", on pourrait écrire:Cela pourrait aussi être écrit comme
qui conserverait la chaîne la plus longue dans PROGMEM au lieu de la placer dans la RAM.
Remarque,
Streaming.h
ne construit aucune chaîne en tant que telle; il ne fait que transmettre le texte de ses<<
arguments à un flux. Une classe PString chez arduiniana peut créer des chaînes à partir d'entrées de flux, si des chaînes au lieu d'une sortie en flux sont souhaitées ou nécessaires.la source
L'utilisation dépendra du type de données de vos variables.
Si elles le sont
int
, ce serait%d
ou%i
si elles le seraientstring
, ce serait%s
Wrapper pour printf
Vous pouvez modifier la limite en fonction de vos besoins
Source: https://playground.arduino.cc/Main/Printf
Exemples d'utilisation:
ESP8266
Son intégré dans la
Serial
classe du cadre. Pas besoin de bibliothèque ou de fonction supplémentaire.Plus de détails sur les astuces de formatage sur la page de référence du format printf: http://www.cplusplus.com/reference/cstdio/printf/
\n
est la séquence d'échappement du saut de ligne.Source: http://fr.cppreference.com/w/cpp/language/escape
[EDIT] - Comme @Juraj l’a mentionné, il n’est pas disponible sur la plupart des modules AVR. J'ai donc ajouté la mention ESP8266 et un wrapper printf pour les modules AVR courants
la source
Une solution possible est:
Serial.println((String)"Var 1:" + var1 + " Var 2:" + var2 + " Var 3:" + var3);
la source
De http://playground.arduino.cc/Main/Printf j'ai observé que cela fonctionne très bien sur mon méga2560
C'est tout ce que cela a juste fonctionné, pas besoin de vsnprintf_P ou PROGMEM ...
la source
printf()
lui - même ?Vous verrez sur le terminal:
la source
+
opérateur.