Powiedzmy, że mam kilka zmiennych, które chcę wydrukować na terminalu. Jaki jest najłatwiejszy sposób na wydrukowanie ich w ciągu?
Obecnie robię coś takiego:
Serial.print("Var 1:");Serial.println(var1);
Serial.print(" Var 2:");Serial.println(var2);
Serial.print(" Var 3:");Serial.println(var3);
Czy jest na to lepszy sposób?
Odpowiedzi:
ardprintf
to funkcja, którą zhakowałem razem, która symulujeprintf
połączenie szeregowe. Tę funkcję (podaną na dole) można wkleić na początku plików, w których funkcja jest potrzebna. Nie powinno powodować żadnych konfliktów.Można go nazwać podobnym do
printf
. Zobacz to w akcji w tym przykładzie:Dane wyjściowe są zgodne z oczekiwaniami:
Prototypem funkcji jest:
Zwraca liczbę argumentów wykrytych w wywołaniu funkcji.
Oto definicja funkcji:
** Aby wydrukować
%
znak, użyj%%
. *Teraz dostępne na listach Github .
źródło
Normalnie nie zadałbym dwóch odpowiedzi na pytanie, ale znalazłem to tylko dzisiaj, gdzie możesz używać printf bez bufora.
Nadal ma to ograniczenie zmiennoprzecinkowe.
edytuj: Myślałem, że zrobię trochę testów na tym, i działa całkiem dobrze. Dodałem lepszy test do pętli ze sformatowanym wyjściem.
źródło
serial_putchar
dlaczego w swojej funkcji nie składasz instrukcji returnreturn !Serial.write(c);
? Czy to nie jest czystsze niż operator trójkowy do odwracania sensu wartości logicznej?serial_putchar
funkcję. Działa uczta. :-) Czy można naprawić ograniczenie zmiennoprzecinkowe ?To chyba nie jest lepsze, po prostu inne. Możesz użyć obiektu String do wydruku. Obiekty te umożliwiają konkatenację i obsługują automatyczne rzutowanie czcionek.
źródło
Zwykle korzystałem z Tabs, aby poprawić porządek w Szeregowym. Ułożenie elementów tak, jak ja, pozwala arduino strzelać tak szybko, jak to możliwe, jednocześnie będąc w stanie zauważyć pewne zmiany w zmiennych.
Wypróbuj coś takiego:
Lub coś w tym stylu:
źródło
Używam tego tylko do debugowania, ale:
źródło
Jestem nowicjuszem w świecie Arduino, ale ostatnio odkryłem, że jest to zwykły C ++ (bez wyjątków i prawdopodobnie polimorfizmu). Ale nadal możesz cieszyć się szablonami. Więc moim rozwiązaniem jest użycie następujących szablonów:
Fajną rzeczą jest to, że nie wykorzystuje tutaj żadnej dodatkowej pamięci i dodatkowego przetwarzania.
źródło
Zwykle (boleśnie) trzymam się wielu linii,
Serial.print
ale kiedy staje się zawiły, wracam dosprintf
. Jest to denerwujące, ponieważ musisz mieć dostępny bufor.Użycie jest tak proste (??) jak:
Słowo ostrzeżenia, nie obsługuje (domyślnie) typów pływających.
źródło
Używanie
Streaming.h
zamiastmożna pisać
Definicja
<<
inStreaming.h
w efekcie przekłada to na szereg zwykłychSerial.print()
wywołań. To znaczy<<
cukier syntaktyczny, realizowany bez zwiększania rozmiaru kodu.Jeśli nie masz
Streaming.h
zainstalowanej, pobierzStreaming5.zip
z arduiniana.org . Rozpakuj go w katalogu bibliotek, na przykład w~/sketchbook/libraries
. Dodaj linię#include <Streaming.h>
w szkicach, których używasz<<
jako operatora strumienia.Dostępne są specyfikatory konwersji bazowej _HEX, _DEC, _OCT i _BIN, a także funkcja _FLOAT (z liczbą miejsc dziesiętnych) i
endl
. Na przykład, aby wydrukować wartości szerokości i długości geograficznej w formie „Twoje współrzędne to -23.123, 135.4567”, można napisać:Można to również zapisać jako
który zachowałby dłuższy ciąg w PROGMEM zamiast wprowadzać go do pamięci RAM.
Uwaga:
Streaming.h
nie buduje żadnych ciągów jako takich; po prostu dostarcza tekst swoich<<
-strumentów do strumienia. Klasa PString na arduiniana można budować ciągi z wejściami strumienia, jeśli struny zamiast wyjścia strumieniowej są pożądane lub konieczne.źródło
Użycie będzie zależeć od typu danych zmiennych.
Jeśli tak
int
, to byłoby%d
lub%i
Jeśli takstring
, byłoby%s
Opakowanie do printf
Możesz zmienić limit w zależności od swoich wymagań
Źródło: https://playground.arduino.cc/Main/Printf
Przykłady użycia:
ESP8266
Jest wbudowany w
Serial
klasę frameworka. Nie potrzeba dodatkowej biblioteki ani funkcji.Więcej informacji na temat wskazówek dotyczących formatowania na stronie odniesienia do formatu printf: http://www.cplusplus.com/reference/cstdio/printf/
\n
jest sekwencją zmiany znaczenia dla wstawiania wiersza.Źródło: http://en.cppreference.com/w/cpp/language/escape
[EDYCJA] - Jak wspomniał @Juraj, nie jest dostępny w większości modułów AVR. Dodałem więc wzmiankę o ESP8266 i opakowanie printf dla popularnych modułów AVR
źródło
Jednym z możliwych rozwiązań jest:
Serial.println((String)"Var 1:" + var1 + " Var 2:" + var2 + " Var 3:" + var3);
źródło
Od http://playground.arduino.cc/Main/Printf Zauważyłem, że działa to dobrze na moim mega2560
To wszystko, co właśnie zadziałało, nie ma potrzeby vsnprintf_P lub PROGMEM ...
źródło
printf()
samego siebie ?Na terminalu zobaczysz:
źródło
+
operatorem.