Go Down

Topic: Frage zu Serial.print <> Serial.println und Fenster löschen (Read 2116 times) previous topic - next topic

Doc_Arduino

Feb 08, 2013, 05:34 pm Last Edit: Feb 08, 2013, 05:42 pm by Doc_Arduino Reason: 1
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?
Tschau
Doc Arduino

markbee

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.
XBee blog: http://lookmanowire.blogspot.com/

Doc_Arduino

Tschau
Doc Arduino

markbee

Bei putty kann man z.B. den scrollback auf 1 einstellen, d.h. nur eine Zeile wird ständig erneuert.
XBee blog: http://lookmanowire.blogspot.com/

pylon

Quote
hmm, okay, wie lauten die bestimmten Befehle?


Die Doku gibt's hier: http://en.wikipedia.org/wiki/ANSI_escape_code

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

Doc_Arduino

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.

Code: [Select]

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);
Tschau
Doc Arduino

pylon

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

Doc_Arduino

#7
Feb 08, 2013, 07:48 pm Last Edit: Feb 08, 2013, 08:13 pm by Doc_Arduino Reason: 1
Hallo,

mit beiden schreibt er vor jede Zeile 27 2J

Code: [Select]

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

Tschau
Doc Arduino

pylon

Der Code müsste so aussehen:

Code: [Select]
Serial.write(0x1B); // Escape
Serial.print("[2J");


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

Code: [Select]
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.

jurs


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.

Code: [Select]


// 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()
{
}

Doc_Arduino

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.
Tschau
Doc Arduino

jurs

#11
Feb 09, 2013, 09:17 pm Last Edit: Feb 09, 2013, 09:20 pm by jurs Reason: 1

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.

Go Up