Arduino Serial.die print () - Optimierung
unsigned long current_millis_value = 0;
unsigned long previous_millis_value = 0;
unsigned long m = 0;
unsigned int seconds = 0;
unsigned int minutes = 0;
unsigned int hours = 0;
unsigned long clockTimeStart = 1800000; //30 Minutes
unsigned long currentClockTime;
void loop() {
current_millis_value = millis();
currentClockTime -= current_millis_value - previous_millis_value;
previous_millis_value = current_millis_value;
minutes = (currentClockTime / 1000 / 60);
seconds = (currentClockTime / 1000) % 60;
m = (currentClockTime % 100);
Serial.print(minutes);
Serial.print(":");
Serial.print(seconds);
Serial.print(":");
Serial.println(m);
}
Ich bin immer eine Lücke in den Zeiten zwischen der seriellen schreibt von überall aus 9-11 ms pro serial line geschrieben. Gibt es eine Möglichkeit zur Optimierung der Serial.print()
- Methode erlauben schreiben mehrerer Werte über Arten von lang-und String-Werte?
Beispiel (dies ist nicht gültig, aber entlang der Linien von dem, was ich mir denke):
Serial.print(minutes + ":" + seconds + ":" + m);
Ich weiß, das ist nicht JavaScript arbeite ich in gerade auf der Suche nach Optimierungsmöglichkeiten für den Schreibprozess. Ich weiß, dass MOD kann teuer werden, aber gerade dabei das einfache Subtraktion und schreiben den Wert currentClockTime hinterlässt bei mir eine Lücke Zeit von 6-7 ms.
Hat man sich bei der Ausgabe auf einem Oszilloskop zu sehen, wenn die Lücke kommt? Das könnte helfen das problem einzugrenzen.
InformationsquelleAutor Jeff | 2011-04-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der arduino hat eine semi-java wie die string-Verkettung. Ich habe keine Ahnung, ob dies bekommen Sie etwas beschleunigen, aber es wird verketten alles in einen string, bevor Sie zu senden.
Wenn Sie in der Lage zu rekonstruieren, die die Zeichenfolge auf der anderen Seite, vielleicht eine bessere Vorgehensweise ist die Verwendung
Serial.Write
und senden die Rohdaten rekonstruieren Sie dann die Zeichenfolge, die auf der empfangenden Seite. Dies würde reduzieren die Menge der Daten, die Sie senden jede Schleife von 5-10 Byte 3-4 bytes.Der Vorteil eines Puffers ist, dass würde man nur benötigen, weisen Sie ihn einmal nicht benötigen, zu reservieren, ist es an der Zeit, die Sie Sie verwenden. Ich habe es noch nicht getestet ausdrücklich, aber das ist etwas, das Sie ausprobieren könnten.
InformationsquelleAutor helloworld922
Den Streaming Bibliothek sollte das tun, was Sie wollen:
InformationsquelleAutor John Y
Irgendeiner Weise zu pre-wandeln Sie alles in einen string-Wert, so dass Sie schreiben können Sie sich den gesamten string auf einmal? Zum Beispiel, verwenden Sie so etwas wie ein
snprintf()
- Funktion zum schreiben in ein pre-allocatedchar[]
, die Sie dann ausdrucken in einem Aufruf zuSerial.print()
?So zum Beispiel:
--Jason
Der Nachteil bei der Verwendung jeder Variante von printf() ist, dass der code-Größe zu erhöhen ~1-2KB.
InformationsquelleAutor Jason
Fand ich der einfachste Weg, um Serielle drucken eines einzelnen string aus ganzen zahlen und Ihre Worte (message):
in scketch :
ERGEBNIS:
Auf dem seriellen monitor sehen Sie als eine einzige ZEILE!!!!!!!!!!):
meine Nummer ist: 12 -, die verwendet werden in der Berechnung!
InformationsquelleAutor Vettel
Der Schnellste und bevorzugte Weg, dies zu tun Verkettung von Strings unter Arduino ist,
Durch Anwendung der oben genannten Richtlinien, die Verkettung Operationen erfolgt.
Beachten Sie, dass die reserve() aufgerufen werden soll, mit den am besten geeigneten Wert für die Zeilen-Puffer-Kapazität, d.h.: maximale Anzahl der Zeichen, die Sie benötigen, bevor die Zeichenfolge tut ein realloc(), nicht einschließlich das null-Endzeichen '\0'.
Drei alternativen Folgen:
1) Hier ist der Beispielcode,
2) Als alternative zum Aufruf von reserve() in setup(), könnten Sie deklariert und initialisiert den String mit "Vorlage" oder dummy-Zeichenfolge, welche die gewünschte (maximale) Länge.
Hier ist der Beispielcode für diese alternative,
Der erste Ansatz ermöglicht die Nutzung von reserve() mit einem dynamisch berechneten maximalen Länge Wert, während der zweite Ansatz führt zu einer etwas saubereren code zu Lesen, wenn Sie eine "Vorlage" oder bekannt mit fester Länge für die Zeichenfolge, die Sie später sein wird, zu Komponieren.
3) , Wenn Sie nur brauchen, um die Ausgabe der Daten auf den output-stream (meist Seriell), dies ist der Schnellste und kompakteste code, ohne die Notwendigkeit von String oder externe Bibliotheken,
Hinweis: die Antwort von John Y tut genau das gleiche wie bei meinem letzten Stück code, mit Ausnahme seiner "einfacher" zu Lesen code (vorausgesetzt, Sie fühlen sich wohl mit dem operator <<, als C++ - streaming-syntaktischen Zucker). In einigen Fällen jedoch, mithilfe der Streaming-Bibliothek generieren, die etwas größeren/langsameren code.
InformationsquelleAutor jose.angel.jimenez