Angenommen, ich habe einige Variablen, die ich auf dem Terminal ausdrucken möchte. Wie kann ich sie am einfachsten in einer Zeichenfolge ausdrucken?
Momentan mache ich so etwas:
Serial.print("Var 1:");Serial.println(var1);
Serial.print(" Var 2:");Serial.println(var2);
Serial.print(" Var 3:");Serial.println(var3);
Gibt es einen besseren Weg, dies zu tun?
Antworten:
ardprintf
ist eine Funktion, die ich zusammen gehackt habe und dieprintf
über die serielle Verbindung simuliert . Diese Funktion (unten angegeben) kann am Anfang der Dateien eingefügt werden, in denen die Funktion benötigt wird. Es sollten keine Konflikte entstehen.Man kann es ähnlich nennen wie
printf
. Sehen Sie es in Aktion in diesem Beispiel:Die erwartete Ausgabe ist:
Der Funktionsprototyp ist:
Es gibt die Anzahl der im Funktionsaufruf erkannten Argumente zurück.
Dies ist die Funktionsdefinition:
**
%
Verwenden Sie zum Drucken des Zeichens%%
. *Jetzt bei Github erhältlich .
quelle
Normalerweise würde ich auf eine Frage keine zwei Antworten geben, aber ich habe dies erst heute gefunden, wo Sie printf ohne Puffer verwenden können.
Dies hat immer noch die Gleitkomma-Begrenzung.
edit: Ich dachte, ich würde ein wenig testen, und es funktioniert ganz gut. Ich habe der Schleife einen besseren Test mit formatierter Ausgabe hinzugefügt.
quelle
serial_putchar
Funktion die return-Anweisung abreturn !Serial.write(c);
. Ist das nicht sauberer als ein trinärer Operator zum Invertieren des Sinns eines booleschen Rückgabewerts?serial_putchar
Funktion. Es funktioniert ein Vergnügen. :-) Kannst du die Fließkommabegrenzung korrigieren ?Das ist wahrscheinlich nicht besser, nur anders. Sie können das String- Objekt für die Ausgabe verwenden. Diese Objekte ermöglichen die Verkettung und unterstützen das automatische Typecasting.
quelle
Normalerweise habe ich Tabs verwendet, um die Reihenfolge in der Serie zu verbessern. Wenn die Dinge so ausgerichtet sind, wie ich es tue, kann der Arduino so schnell wie möglich feuern, während er in der Lage ist, bestimmte Änderungen in den Variablen zu bemerken.
Versuchen Sie so etwas:
Oder so ähnlich:
quelle
Ich benutze dies nur zum Debuggen, aber:
quelle
Ich bin ein Neuling in der Arduino-Welt, aber ich habe kürzlich festgestellt, dass dies nur ein reguläres C ++ ist (ohne Ausnahmen und wahrscheinlich Polymorphismus). Sie können jedoch weiterhin Vorlagen genießen. Meine Lösung besteht also darin, folgende Vorlagen zu verwenden:
Das Schöne dabei ist, dass hier kein zusätzlicher Speicher und keine zusätzliche Verarbeitung erforderlich ist.
quelle
Ich halte mich normalerweise (schmerzhaft) an mehrere Zeilen von,
Serial.print
aber wenn es verworren ist, gehe ich zurück zusprintf
. Es ist ärgerlich, dass Sie einen verfügbaren Puffer dafür haben müssen.Die Verwendung ist so einfach (??) wie:
Ein Hinweis: Floating-Typen werden (standardmäßig) nicht unterstützt.
quelle
Verwenden Sie
Streaming.h
anstelle vonman kann schreiben
Die Definition von
<<
inStreaming.h
in effect übersetzt dies in eine Reihe von gewöhnlichenSerial.print()
Aufrufen. Das heißt, es<<
handelt sich um syntaktischen Zucker, der ohne Erhöhung der Codegröße implementiert wird.Wenn Sie nicht
Streaming.h
installiert haben, erhalten SieStreaming5.zip
von arduiniana.org . Entpacken Sie es in Ihr Bibliotheksverzeichnis, zum Beispiel in~/sketchbook/libraries
. Fügen Sie die Linie#include <Streaming.h>
in die Skizzen ein, die Sie<<
als Stream-Operator verwenden.Es werden die Basisumwandlungsspezifizierer _HEX, _DEC, _OCT und _BIN sowie eine _FLOAT-Funktion (mit der Anzahl der Dezimalstellen) und bereitgestellt
endl
. Wenn Sie beispielsweise Breiten- und Längengrade in einem Formular wie "Ihre Koordinaten sind -23,123, 135,4567" drucken möchten, können Sie Folgendes eingeben:Dies könnte auch geschrieben werden als
Das würde den längeren String in PROGMEM behalten, anstatt ihn in den RAM zu bringen.
Beachten Sie,
Streaming.h
dass keine Zeichenfolgen als solche erstellt werden. es liefert nur den Text seiner<<
Argumente an einen Stream. Eine PString-Klasse in arduiniana kann Zeichenfolgen aus Stream-Eingaben erstellen , wenn Zeichenfolgen anstelle von Stream-Ausgaben gewünscht oder benötigt werden.quelle
Die Verwendung hängt vom Datentyp Ihrer Variablen ab.
Wenn sie sind
int
, wäre es%d
oder%i
wenn sie sindstring
, wäre es%s
Wrapper für printf
Sie können das Limit gemäß Ihren Anforderungen ändern
Quelle: https://playground.arduino.cc/Main/Printf
Anwendungsbeispiele:
ESP8266
Es ist in der
Serial
Klasse des Frameworks eingebaut . Keine Notwendigkeit für zusätzliche Bibliothek oder Funktion.Weitere Informationen zu Formatierungstipps finden Sie auf der Referenzseite zum PrintF-Format: http://www.cplusplus.com/reference/cstdio/printf/
\n
ist die Escape-Sequenz für den Zeilenvorschub.Quelle: http://en.cppreference.com/w/cpp/language/escape
[ BEARBEITEN ] - Wie bei @Juraj bereits erwähnt, ist es bei den meisten AVR-Modulen nicht verfügbar. Also habe ich ESP8266 erwähnt und einen printf-Wrapper für gängige AVR-Module hinzugefügt
quelle
Eine mögliche Lösung ist:
Serial.println((String)"Var 1:" + var1 + " Var 2:" + var2 + " Var 3:" + var3);
quelle
Unter http://playground.arduino.cc/Main/Printf habe ich festgestellt, dass dies auf meinem mega2560 einwandfrei funktioniert
Das ist alles, was es gerade funktioniert hat, keine Notwendigkeit für vsnprintf_P oder PROGMEM ...
quelle
printf()
?Sie sehen am Terminal:
quelle
+
Operator zu einer C-Zeichenfolge verketten .