Go Down

Topic: printf statt Serial.println...Vorteil in der Geschwindigkeit der Ausgabe? (Read 2718 times) previous topic - next topic

Schnix

Bringt es einen Geschwindigkeitszuwachs die C++ Ausgabefunktion printf() einzubinden statt Serial.println zu verwenden?





pylon

Quote
Bringt es einen Geschwindigkeitszuwachs die C++ Ausgabefunktion printf() einzubinden statt Serial.println zu verwenden?


Wieso probierst Du's nicht einfach aus?

7 Zeichen bei 115200 Baud zu übertragen, benötigt übrigens im Idealfall schon über 600µs, da sind die 960µs doch gar nicht mal so schlecht.

Serenifly

Wie in dem anderen Thread gesagt:

am schnellsten wirst du wenn du statt ASCII Strings den analogRead() Wert roh in einem Byte (8 bit Auflösung) oder zwei Byte (10 Bit Auflösung) überträgst und die Umrechnung auf dem PC erledigst.

Serenifly

Auf der Arduino Seite ist das kein Thema. Einfach Serial.write(). Eventuell highByte() und lowByte() um einen int in Bytes zu zerlegen (oder per Hand mit Schieben um 8 ), da write() immer nur ein Byte schickt.

Die größere Herausforderung für dich ist auf der PC Seite. Da musst du ein kleines Programm schreiben, dass das empfängt, umrechnet und anzeigt. Das ist auch nicht schwierig, aber auch nur wenn man schonmal GUIs erstellt hat. Das kommt darauf wie da deine Erfahrung ist.


Falls printf() auf dem Arduino überhaupt funktioniert ist die Ersparnis wahrscheinlich minimal. Die größte Zeit geht für die physische Übertragung drauf. Seriell ist nunmal langsam getaktet.

michael_x

printf mit float geht sowieso nicht in avr-gcc und damit nicht auf dem Arduino
Code: [Select]

float meinfloat=123.456;
char buf[20];
sprintf(buf, "%f\n", meinfloat); // geht nicht
Serial.write(buf);


Und Serenifly hat vollkommen recht: Ob du Serial.print(float)  oder dtostrf und Serial.write verwendest, macht keinen Unterschied im Vergleich zur seriellen Übertragung selbst.

Übrigens: Irgend ein Trennzeichen solltest du auch immer vorsehen, wie willst du sonst 2 Zahlen unterscheiden...

Serenifly

Und purem AVR-gcc geht es auch mit Float wenn man die Linker Optionen korrekt setzt:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaa3b98c0d17b35642c0f3e4649092b9f1

Aber auf dem Arduino ist es vorgegeben. Wobei es da auch Patches und alternative Implementierungen mit Float gibt.

Aber wie gesagt, bringt das hier nichts :)

Go Up