Forum: Mikrocontroller und Digitale Elektronik Arduino Frage zu Serial.println()


von Absence (Gast)


Lesenswert?

Moin,

wenn ich bei einem Arduino mit dem Befehl Serial.println(x) 
beispielsweise Daten ausgebe, dann schreibt der Arduino das ganze ja in 
einen Buffer, sodass die Vergangenheitswerte stets erhalten bleiben.
Bspw. 1
2
3
4
5
usw.

Gibt es die Möglichkeit das zu verhindern?
Anstatt, dass der Arduino die alten Werte behält, soll er immer wieder 
alten Werte überschreiben, sodass ich quasi immer nur auf den 
aktuellsten Wert zugreifen kann.

von L. N. (derneumann)


Lesenswert?

Tut er nicht, das ist dein Programm welches du verwendest um dich per 
serieller Schnittstelle zum Arduino zu verbinden. Dieses Programm 
(Serial Monitor der Arduino IDE?) reiht die Ausgaben des Arduino 
aneinander. Das einzige was da die "Vergangenheitswerte" speichert ist 
die Textbox deines Serial Monitors.

Und nein, kann man nicht verhindern. Du müsstest selber ein Programm 
schreiben, welches immer nur die letzte vom Arduino empfangene Zeile 
anzeigt.

von Absence (Gast)


Lesenswert?

Aber wenn ich auf die Daten der seriellen Schnittstelle zurückgreife und 
die Plots vom Arduino Plotter mit meinem Plotter aus Matlab vergleiche, 
dann sehe ich eine riesige Latenz zwischen den Veränderungen, wenn ich 
das Signal beispielsweise ändere. Im Arduino Plotter, sehe ich 
Veränderungen instantan und in Matlab dauert es ewig... Vielleicht liegt 
es dann an meiner Kommunikation bzw. dass die Bluetooth Kommunikation 
allgemein sehr langsam ist... Es wirkt nämlich so, wenn ich den Plotter 
neustarte in Matlab, dass dieser immer auf die ersten Werte vom Arduino 
zugreift, sprich immer weiter hinterhängt, je später ich die 
Kommunikation starte.

von Wolfgang (Gast)


Lesenswert?

L. N. schrieb:
> Und nein, kann man nicht verhindern. Du müsstest selber ein Programm
> schreiben, welches immer nur die letzte vom Arduino empfangene Zeile
> anzeigt.

Warum soll man dafür ein eigenes Programm schreiben müssen. Jedes 
vernünftige Terminal Emulationsprogramm, dass zu Recht zu dieser Gattung 
zählt, verfügt über die Möglichkeit der Cursor Positionierung. Der µC 
muss lediglich die Positioniersequenzen in den mit Serial.print() 
erzeugten Datenstrom einfügen. Serial.println() ist dafür allerdings 
eher nicht geeignet, weil es <CR><LF>-Sequenzen einfügt, die man gerade 
nicht haben möchte.

von L. N. (derneumann)


Lesenswert?

Wolfgang schrieb:
> Der µC
> muss lediglich die Positioniersequenzen in den mit Serial.print()
> erzeugten Datenstrom einfügen. Serial.println() ist dafür allerdings
> eher nicht geeignet, weil es <CR><LF>-Sequenzen einfügt, die man gerade
> nicht haben möchte.

merkste selber, ne? :-D

von Stefan F. (Gast)


Lesenswert?

Bei vielen Terminalprogrammen kann man die aktuelle Zeile so 
überschrieben:

Serial.print("\r%d",x);

Der serielle Monitor von der Arduino IDE kann das nicht, soweit ich 
weiß. Da musst du andere Software verwenden.

Eventuell möchtest du die Ausgabe so formatieren, dass die Ausgabe immer 
gleich breit ist, so dass nicht ungewollt Überreste der vorherigen Zeile 
stehen bleiben:

Serial.print("\r%6d",x);

Siehe https://playground.arduino.cc/Main/Printf/

von Yalu X. (yalu) (Moderator)


Lesenswert?

Absence schrieb:
> Aber wenn ich auf die Daten der seriellen Schnittstelle zurückgreife und
> die Plots vom Arduino Plotter mit meinem Plotter aus Matlab vergleiche,
> dann sehe ich eine riesige Latenz zwischen den Veränderungen, wenn ich
> das Signal beispielsweise ändere.

Wenn das Problem mit dem Matlab-Plotter auftritt, nicht aber mit dem
Arduino-Plotter, ist ja schon einmal klar, dass die Ursache nicht auf
der Mikrocontrolleresite liegen kann.

Absence schrieb:
> Vielleicht liegt es dann an meiner Kommunikation bzw. dass die
> Bluetooth Kommunikation allgemein sehr langsam ist

Wenn du in beiden Fällen dieselbe Kommunikationsschnittstelle benutzt
und der Matlab-Plotter dann immer noch langsamer ist, weißt du, dass es
an der PC-seitigen Software liegen muss.

Du schreibst "mit meinem Plotter aus Matlab": Hast du den selber
geschrieben? Bist du sicher, dass er sich bzgl. Datenpufferung gleich
verhält wie der Arduino-Plotter? Letzterer scheint die jeweils letzten n
Werte in einem FIFO-Puffer zu speichern und den Inhalt dieses Puffers zu
plotten, so dass die Messkurve horizontal durchgescrollt wird. Wenn dein
Matlab-Plotter hingegen sämtliche Werte seit dem Programmstart speichert
und plottet, wird die Anzeige mit wachsender Datenmenge logischerweise
immer langsamer werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.