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