Frage zu Serial.print <> Serial.println und Fenster löschen

Hallo,

was genau ist der Unterschied zwischen Serial.print und Serial.println ?

Im Terminalfenster macht das bisher keinen Unterschied. Aus der englischen Beschreibung werde ich leider nicht schlauer. Dann wollte ich das Terminalfenster nach Ausgabe von 2 Zahlen löschen und diese wieder ausgeben lassen. Fenster löschen soll mit Serial.print("\r"); funktionieren. Macht es aber nicht.
Die Ausgabe soll quasi im Fenster nicht nach unten scrollen sondern oben stehen bleiben und aktualisiert werden.

Kann mir bitte jemand helfen?

Edit:

Okay, war zu ungeduldig, Serial.println mit Zeilenumbruch.

Aber wie lösche ich das Fenster?

Der Serial Monitor der Arduino IDE ist zum debuggen gedacht und kann nicht gelöscht werden.
Bei anderen Terminalprogrammen kann man die Ausgabe aber mit bestimmten Befehlen löschen.

hmm, okay, wie lauten die bestimmten Befehle?

Bei putty kann man z.B. den scrollback auf 1 einstellen, d.h. nur eine Zeile wird ständig erneuert.

hmm, okay, wie lauten die bestimmten Befehle?

Die Doku gibt's hier: ANSI escape code - Wikipedia

Dein gewünschter Code dürfte ESC [ 2 J sein.

Hallo,

habe mir mal Putty runtergeladen und Scrollback auf 1 gesetzt. Im Code braucht man dann noch Serial.print("\r");
Aber dann haut das im IDE Terminal überhaupt nicht mehr hin, alles durcheinander.
Wenn man jedesmal den Code ändern muß je nach Terminal wird das Mist.
So einen richtig sauberen Clear Befehl und Cursor at home wie bei einem Display gibts wohl nicht - oder?

Mit [2J wird das leider auch nichts. Das Putty Fenster wird Zeilenweise vollgeschrieben.
Habe dann nochmal mit dem schon länger sonst benutzten HTerm probiert. Ändert nichts.

val = analogRead(analogPin);         // reads the value of the potentiometer (value between 0 and 1023)
   Serial.print("Analog Eingang ");
   Serial.print(val, DEC);
   val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0° and 180°)
   Serial.print(" Servo Position ");
   Serial.print(val, DEC);
   Serial.print(" Grad");
   Serial.print("[2J");                       // Terminalfenster löschen   
   
   myservo.write(val);

Das Escape-Zeichen (ASCII 27 bzw. 0x1B) darfst Du nicht vergessen, das leitet die Sequenz ein.

Hallo,

mit beiden schreibt er vor jede Zeile 27 2J

Serial.print("[27");    
Serial.print("[2J");

Der Code müsste so aussehen:

Serial.write(0x1B); // Escape
Serial.print("[2J");

Je nach Interpretation der Zahl im Wikipedia-Artikel könnte es auch so sein:

Serial.write(0x1B); // Escape
Serial.write('[');
Serial.write(0x02);
Serial.write('J');

Im Serial Monitor der IDE wird das nicht funktionieren, im Putty bzw. HTerm müsste es eigentlich gehen.

Doc_Arduino:
So einen richtig sauberen Clear Befehl und Cursor at home wie bei einem Display gibts wohl nicht - oder?

Es gibt natürlich einen richtig sauberen clear Befehl und den Cursor kannst Du bei Terminals setzen wohin Du möchtest.

Bei seriellen Terminals ist es nur so: Historisch gesehen ist ein Terminal eine Hardware und hat bestimmte Eigenschaften. Und so viele Hardwarehersteller für Terminals es gab und so viele Terminalmodelle die auf den Markt geschmissen haben, so viele verschiedene Terminal-Standards gibt es. Also hunderte!

Bei den Software-Terminalemulationen auf Computerbildschirmen ist der kleinste gemeinsame Nenner bei der Bildschirmausgabe meist der "ANSI" oder "VT100" Standard, mit dem ein DEC VT100 Terminal aus Ende der siebziger Jahre emuliert wird. So auch bei Putty.

D.h. die wesentlichen Sequenzen, die Putty versteht, kann man unter dem Suchbegriff "VT100 terminal control codes" ergoogeln. Z.B.:
http://www.termsys.demon.co.uk/vtansi.htm

Zu Demonstrationszwecken habe ich mal einen kleinen Test-Sketch zusammengeklatscht, mit dem man eine Anzeige "in bunt" auf dem Putty-Terminal hinbekommt.

// Demonstration code for ANSI/VT100 terminal codes on Arduino
// Created by "jurs" for German Arduino forum
// Do NOT use the Arduino serial monitor with this sketch!
// You must use a terminal emulation software to show the serial output correctly.
// When using Windows you can use "PUTTY" configured to your Arduino COM Port.

// defines taken from list at http://www.fourwalledcubicle.com/files/LUFA/Doc/090605/html/dd/d6d/a00111.html
#define	ANSI_ESCAPE_SEQUENCE(c) "\33[" c
#define	ESC_RESET ANSI_ESCAPE_SEQUENCE("0m")
#define	ESC_BOLD_ON ANSI_ESCAPE_SEQUENCE("1m")
#define	ESC_ITALICS_ON ANSI_ESCAPE_SEQUENCE("3m")
#define	ESC_UNDERLINE_ON ANSI_ESCAPE_SEQUENCE("4m")
#define	ESC_INVERSE_ON ANSI_ESCAPE_SEQUENCE("7m")
#define	ESC_STRIKETHROUGH_ON ANSI_ESCAPE_SEQUENCE("9m")
#define	ESC_BOLD_OFF ANSI_ESCAPE_SEQUENCE("22m")
#define	ESC_ITALICS_OFF ANSI_ESCAPE_SEQUENCE("23m")
#define	ESC_UNDERLINE_OFF ANSI_ESCAPE_SEQUENCE("24m")
#define	ESC_INVERSE_OFF ANSI_ESCAPE_SEQUENCE("27m")
#define	ESC_STRIKETHROUGH_OFF ANSI_ESCAPE_SEQUENCE("29m")
#define	ESC_FG_BLACK ANSI_ESCAPE_SEQUENCE("30m")
#define	ESC_FG_RED ANSI_ESCAPE_SEQUENCE("31m")
#define	ESC_FG_GREEN ANSI_ESCAPE_SEQUENCE("32m")
#define	ESC_FG_YELLOW ANSI_ESCAPE_SEQUENCE("33m")
#define	ESC_FG_BLUE ANSI_ESCAPE_SEQUENCE("34m")
#define	ESC_FG_MAGENTA ANSI_ESCAPE_SEQUENCE("35m")
#define	ESC_FG_CYAN ANSI_ESCAPE_SEQUENCE("36m")
#define	ESC_FG_WHITE ANSI_ESCAPE_SEQUENCE("37m")
#define	ESC_FG_DEFAULT ANSI_ESCAPE_SEQUENCE("39m")
#define	ESC_BG_BLACK ANSI_ESCAPE_SEQUENCE("40m")
#define	ESC_BG_RED ANSI_ESCAPE_SEQUENCE("41m")
#define	ESC_BG_GREEN ANSI_ESCAPE_SEQUENCE("42m")
#define	ESC_BG_YELLOW ANSI_ESCAPE_SEQUENCE("43m")
#define	ESC_BG_BLUE ANSI_ESCAPE_SEQUENCE("44m")
#define	ESC_BG_MAGENTA ANSI_ESCAPE_SEQUENCE("45m")
#define	ESC_BG_CYAN ANSI_ESCAPE_SEQUENCE("46m")
#define	ESC_BG_WHITE ANSI_ESCAPE_SEQUENCE("47m")
#define	ESC_BG_DEFAULT ANSI_ESCAPE_SEQUENCE("49m")
#define	ESC_CURSOR_POS(L,C) ANSI_ESCAPE_SEQUENCE(#L ";" #C "H")
#define	ESC_CURSOR_UP(L) ANSI_ESCAPE_SEQUENCE(#L "A")
#define	ESC_CURSOR_DOWN(L) ANSI_ESCAPE_SEQUENCE(#L "B")
#define	ESC_CURSOR_FORWARD(C) ANSI_ESCAPE_SEQUENCE(#C "C")
#define	ESC_CURSOR_BACKWARD(C) ANSI_ESCAPE_SEQUENCE(#C "D")
#define	ESC_CURSOR_POS_SAVE ANSI_ESCAPE_SEQUENCE("s")
#define	ESC_CURSOR_POS_RESTORE ANSI_ESCAPE_SEQUENCE("u")
#define	ESC_ERASE_DISPLAY ANSI_ESCAPE_SEQUENCE("2J")
#define	ESC_ERASE_LINE ANSI_ESCAPE_SEQUENCE("K")

void s(char* str) 
{ // put string to Serial - short form
  Serial.print(str);
}

void sendcursor(int r, int c)
{ // set ANSI terminal cursor to specified row and column
  char str[12];
  sprintf(str,"\33[%d;%dH",r,c);
  s(str);
}

void settext(char* fg, char* bg, char* cup, char* str)
// send text to terminal with foreground color, background color, cursor position
{
  s(cup); 
  s(fg);
  s(bg);
  s(str);
}

void clearsquare(char* fg, char* bg, int r1, int c1, int r2, int c2)
{ // clears a square on the terminal window with colors set
  s(fg);
  s(bg);
  for (int i=0;i<r2-r1;i++) 
  {
    sendcursor(r1+i, c1);
    for (int i=0;i<c2-c1;i++) s(" ");
  }  
}

void ShowScreen()
{
  s(ESC_BG_BLUE);
  s(ESC_FG_GREEN);
  s(ESC_ERASE_DISPLAY);
  clearsquare(ESC_FG_BLACK,ESC_BG_WHITE, 4,10, 18,40);
  settext(ESC_FG_BLACK,ESC_BG_CYAN,ESC_CURSOR_POS(5, 11),  "   Arduino Ansi Terminal    ");
  settext("","",ESC_CURSOR_POS(6, 11),                     "     Root Shell Account     ");
  settext("","",ESC_CURSOR_POS(7, 11),                     "    W I L L K O M M E N     ");
  settext(ESC_FG_GREEN,ESC_BG_BLACK,ESC_CURSOR_POS(10, 11)," 1. Pizza bestellen         ");
  settext(ESC_FG_GREEN,ESC_BG_BLACK,ESC_CURSOR_POS(11, 11)," 2. Nach Hause telefonieren ");
  settext(ESC_FG_GREEN,ESC_BG_BLACK,ESC_CURSOR_POS(12, 11)," 3. Arduino programmieren   ");
  settext(ESC_FG_GREEN,ESC_BG_BLACK,ESC_CURSOR_POS(13, 11)," 4. Im Internet surfen      ");
  settext(ESC_FG_GREEN,ESC_BG_BLACK,ESC_CURSOR_POS(14, 11)," 5. Ausloggen               ");
  settext(ESC_FG_BLACK,ESC_BG_RED,ESC_CURSOR_POS(16, 16), " Ihre Auswahl:  ");
}


void setup()
{
  Serial.begin(9600);
  ShowScreen();
}

void loop()
{
}

Hallo,

was hier für tolle Leute im Forum unterwegs sind und was für ein Wissen haben ist schon beeindruckend. Danke. Werde das probieren und versuchen zu verstehen was abläuft.

Doc_Arduino:
Werde das probieren und versuchen zu verstehen was abläuft.

Anbei mal ein kleiner Screenshot, wie es im Putty-Terminal aussehen sollte, wenn der Arduino seinen Demo-Bildschirm an Putty sendet und dabei alles korrekt konfiguriert ist.

Arduino_Terminal.jpg

Hallo,
ich würde gerne meine Ausgaben eines Arduino-Sketches "Wetterstation" auf mein Android-Handy zusätzlich zum TFT auf dem Board ausgeben.
Ich benutze aktuell die APP BTduino. Leider scrollt der Text weiter und der alte Text wird nicht gelöscht.
Kann ich die Serial.print-Zeilen so umschreiben, dass die alten Ausgaben jeweils überschrieben werden?

Hier der Sketch-Teil:

/* Serial Monitor oeffnen und zum Erhalt der Messwerte druecken.
Messwerte auch auf Handy ueber APP BTduino lesbar.
*/

if (Serial.available()) {
Serial.println("Wetterstation");
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(" ");
if (now.hour()<10)
Serial.print('0');
Serial.print(now.hour(), DEC);
Serial.print(':');
if (now.minute()<10)
Serial.print('0');
Serial.print(now.minute(), DEC);
Serial.print(':');
if (now.second()<10)
Serial.print('0');
Serial.print(now.second(), DEC);
Serial.println(" ");
Serial.print("Temp: ");
Serial.print(mySensor.getTemperatureC());
Serial.print(" Celsius");
Serial.println(" ");
Serial.print("Feuchte: ");
Serial.print(mySensor.getHumidity());
Serial.print(" %");
Serial.println(" ");
Serial.print("Druck: ");
Serial.print(bmp.readPressure()/100+2);
Serial.print(" hPa");
Serial.println(" ");
Serial.println("-----------------------------");
}

Danke vorab und Gruß

Anzahl der Zeilen im BTduino fix?
Überschreiben kann man soweit bekannt ist, nicht. Du hast aber die Möglichkeit den Cursor am Anfang der Zeile zu setzen und kannst für eine Zeile die Werte überschreiben.

Such mal nach carriage return

4711engel:
Kann ich die Serial.print-Zeilen so umschreiben, dass die alten Ausgaben jeweils überschrieben werden?

Hast Du meinen Demo-Sketch in Antwort #9 gesehen?

In diesem Programm habe ich eine "settext" Funktion gepostet, mit der gleichzeitig

  • eine Vordergrundfarbe
  • eine Hintergrundfarbe
  • eine Cursorposition gesetzt werden und
  • ein String an der Cursorposition ausgegeben werden

Du mußt dafür natürlich immer wissen, in welcher Zeile/Spalte die Ausgabe im Terminalfenster beginnen soll.

Beispiel für Ausgabe mit grüner Schrift auf schwarzem Hintergrund in Zeile-13 und Spalte-11:

settext(ESC_FG_GREEN,ESC_BG_BLACK,ESC_CURSOR_POS(13, 11)," 4. Im Internet surfen      ");

Wenn Du nur den Cursor an einer bestimmten Stelle im Fenster positionieren möchtest, bevor Du die nächste Ausgabe machst, kannst Du die Funktion "sendcursor" aus dem Demoprogramm dafür verwenden. Wenn Du danach etwas mit Serial.print ausgibst, erfolgt die Ausgabe immer mit der zuletzt gesetzten Vordergrund- und Hintergrundfarbe.

Hallo Jurs,
bin auf Deine Antwort gestoßen. Deinen "hingeklatschten" Sketch habe ich ausprobiert und er läuft. Ich möchte mir auf dieser Basis ein serielles Debugtool zusammen stellen. Es werden aber Wanings ausgegeben "deprecated conversion from string to constant to 'char*'. Kann ich das ignorieren? Gibt es Alternativen? Auswirkungen sehe ich keine.
Gruß Willi

P.S. Kann man Putty auch disconnecten wir z.B. CoolTerm, oder muss es immer geschlossen und neu gestartet werden?

Tip: diese Warnungen kann man Googeln. Das ist alles standardisiert.

String Literale sollten immer const sein. Genauso ein Parameter mit dem du einen C String an eine Funktion übergibst (was in diesem Fall die Warnungen erzeugt)

const char* str = "blah";
void func(const char* str)
{
}

...

func("blah");

Stimmt hätte ich machen können. Sorry. Trotzdem Danke für das Beispiel.

Gruß Willi

Habe jetzt eine Ausgabe an Putty für meine Zwecke geschrieben. Als Vorlage habe ich Jurs Beispiel genommen.

Die Werte sind erst einmal nur Demos. Alles ist OK, nur der Cursor schwirrt pausenlos durch das Fenster. Kann man das abschalten? Ich hab zwar nach entsprechenden Seiten gesucht, aber keine gefunden, die auch Beispiele zeigen.

Die habe ich versucht:
#define ESC_CURSOR_POS(L,C) ANSI_ESCAPE_SEQUENCE(#L ";" #C "H")
#define ESC_CURSOR_POS_SAVE ANSI_ESCAPE_SEQUENCE("s")
#define ESC_CURSOR_POS_RESTORE ANSI_ESCAPE_SEQUENCE("u")

Gruß
Willi

Edit:
Habe es doch eben selbst gefunden;

CSI ?25l DECTCEM Hides the cursor. (Note: the trailing character is lowercase L.)
CSI ?25h DECTCEM Shows the cursor.

KUCKY:
Habe jetzt eine Ausgabe an Putty für meine Zwecke geschrieben. Als Vorlage habe ich Jurs Beispiel genommen.
Fehler - abload.de

Die Werte sind erst einmal nur Demos. Alles ist OK, nur der Cursor schwirrt pausenlos durch das Fenster. Kann man das abschalten? Ich hab zwar nach entsprechenden Seiten gesucht, aber keine gefunden, die auch Beispiele zeigen.

Die habe ich versucht:

Versuche die escape sequenz "?25l" für Cursor OFF
und escape sequenz "?25h" für Cursor ON