Hallo,
ich hätte mal eine Frage.
Ich bin gerade dabei einen Arduino zu programmieren und da hab ich nur
noch ein kleines Problemchen und dann bin ich auch fertig. Und zwar geht
es darum, dass ich mit dem Arduino ein Signal einlese, verarbeite und
das Ergebnis daraufhin auf dem Serial-Monitor ausgebe. Bekomme es zwar
hin einfach was auszugeben, aber er soll letzendlich eine Ausgabezeile
haben die er jede Sekunde aktualisiert.
Also als Beispiel: Der Wert ist : "errechneter Wert"
Jetzt kommt bei mir die ganze Zeit
Der Wert ist : "errechneter Wert"
Der Wert ist : "neu errechneter Wert"
Der Wert ist : "neu errechneter Wert"
Der Wert ist : "neu errechneter Wert"
....
Jetzt möchte ich es so, dass er immer nur den Wert aktualisiert.
Geht das zufällig ?
Wäre super nett, wenn jemand antworten würde
Gruß
Ja geht.
Statt Zeilenvorschub (LF, Linefeed) plus Wagenrücklauf (CR, Carriage
Return) am Zeilenende nur Wagenrücklauf ausgeben.
Wenn das bereits gemacht wird, dann im Serial Monitor das automatische
Hinzufügen von LF abschalten.
Wenn die neue Zeile kürzer ist als die alte, musst du ggf. mit
Leerzeichen auffüllen.
Wenn dir Zeilenvorschub (LF, Linefeed) oder Wagenrücklauf (CR, Carriage
Return) nichts sagen, dann nach ASCII-Codes oder ASCII-Tabelle googlen.
Ob und wie das geht, hängt davon ab was der "Serial Monitor" an
Möglichkeiten für die Steuerung bietet.
Bei einem normalen Terminalprogramm funktioniert das, indem man
bestimmte Steuerzeichen an das Terminal sendet, welches dieses nicht als
Text sondern als Kommandos auffasst. VT100 ist zb so ein Standard.
Ob aber der Arduino Serial Monitor so etwas unterstützt konnte nicht
nicht ergoogeln.
Danke schon mal für die schnellen Antworten, aber irgendwie bekomm ich
das nicht gebacken.
Ich habe gerade mal einen Testquelltext geschrieben, der folgendermaßen
aussieht:
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.print("a");
delay(1000);
Serial.print("b");
delay(1000);
}
So wenn ich jetzt in den Serialmonitor reinschaue, schreibt er mir
immer:
abababababababababababababababababababab
Jetzt möchte ich das aber so, dass er erst a schreibt, dann a löscht und
dann b schreibt und das ganze Spiel wieder von vorn.
Habe das jetzt grad mit dem carriage return probiert. Also einmal mit
"cr" und einmal mit \r. aber jetzt sagt er nur noch einen Fehler, weil
er dass nicht mehr kennt. Im Serialmonitor kann ich auch gar nichts
einstellen, weil ich diese komische Java-Arduino-Software habe und da
ist die Programmierumgebung und der Serialmonitor sehr dürftig
ausgefallen.
Gruß
> Habe das jetzt grad mit dem carriage return probiert. Also einmal mit> "cr" und einmal mit \r. aber jetzt sagt er nur noch einen Fehler, weil> er dass nicht mehr kennt.
Es hilft, wenn du auch den Code zeigst der nicht funktioniert und ein
Copy&Paste der Fehlermeldung.
Hattest du es so geschrieben?
1
voidloop()
2
{
3
Serial.print("\ra");
4
delay(1000);
5
Serial.print("\rb");
6
delay(1000);
7
}
Leider ist die Doku der Methode Print
(http://www.arduino.cc/en/Serial/Print) beim Arduino nicht so präzise
wie ich mir das wünsche. Escapezeichen im String sollten aber gehen,
jedenfalls ist ein Beispiel mit \t aufgeführt.
Hey,
hatte es genauso wie du versucht, aber da kam kein Ergebnis
dann noch so
void loop()
{
Serial.print("a");
delay(1000);
\r
Serial.print("b");
delay(1000);
}
und
void loop()
{
Serial.print("a");
delay(1000);
Serial.print(\r);
Serial.print("b");
delay(1000);
}
und
void loop()
{
Serial.print("a");
delay(1000);
Serial.print(cr);
Serial.print("b");
delay(1000);
}
Aber funktioniert iwie alles nicht. Ist irgendwie ein bissen schwierig
das beim Arduino zu machen.
Gruß
ChristianK schrieb:> void loop()> {> Serial.print("a");> delay(1000);> \r> Serial.print("b");> delay(1000);> }
Das kann nicht gehen.
\r muss ja über die Serielle übertragen werden
> void loop()> {> Serial.print("a");> delay(1000);> Serial.print(\r);> Serial.print("b");> delay(1000);> }
Wenn schon, dann
Serial.print("\r");
oder
Serial.print('\r');
'\r' ist genauso ein einzelnes Zeichen, wie es auch 'a' oder 'b' oder
'0' oder '*' ist.
> void loop()> {> Serial.print("a");> delay(1000);> Serial.print(cr);> Serial.print("b");> delay(1000);> }
Auch hier wieder.
Dazu müsste cr eine Variable sein, was es nicht ist.
Versuch mal noch einen anderes Terminalprogramm statt Arduino Serial
Monitor. Vielleicht wandelt der Arduino Serial Monitor ein einzelnes CR
(Maczeilenende) nach CRLF (Windowszeilenende).
BTW. Arbeitest du mit einem Mac?
Terminalprogramme für Windows und Linux gibt es im Artikel RS232
Hallo,
wollte mich nochmal kurz für die Hilfe bedanken. Anscheindend lag es an
dem Serial Monitor selbst. Habe mir jetzt ein anderes
Hyperterminalprogramm runtergeladen und nun läuft es super :)
Gruß
Ich grabe das hier nochmal aus, da der Tread micherst auf die
Möglichkeiten hingewiesen hat.
Kann man auch mehrere Zeilen auf diese Weise ausgeben, oder gar nur
Werte in einer Maske aktualisieren?
So wirklich was dazu gefunden habe ich nicht, oder war nicht in der Lage
es umzusetzen.
Gibt es eine Erklärung wie man beispielsweise dem Arduino VT100
beibringt?
in eine neue Zeile springe ist mir schon klar.
Nur geht es hier ja darum immer wieder mehrere Zeilen in einem Terminal
abzulöschen und neu zu beschreiben
Was du haben willst sieht mir nach einer Cursorsteuerung aus. Das geht
am besten mit VT100. Das Terminalprogram muss also VT100 Steuersequenzen
kennen.
Das hier benutze ich zusammen mit der Uart-Lib von Peter D.
Fuer Arduino musst du nur alle uart_putc mit Serial.write und uart_puts
mit Serial.print ersetzen.
1
charBUFF[5];
2
3
voidvt100Escape(void)
4
{
5
// ESC
6
uart_putc(27);
7
}
8
voidvt100Init(void)
9
{
10
// initializes terminal to "power-on" settings
11
// ESC c
12
vt100Escape();
13
uart_putc('c');
14
}
15
16
voidvt100ClearScreen(void)
17
{
18
// ESC [ 2 J
19
vt100Escape();
20
uart_puts_P("[2J");
21
}
22
23
voidvt100Home(void)
24
{
25
// ESC [ H
26
vt100Escape();
27
uart_puts_P("[H");
28
}
29
30
voidvt100SetCursorMode(uint8_tstatus)
31
{
32
if(status==TRUE)
33
{
34
// ESC [ ? 25 h
35
vt100Escape();
36
uart_puts_P("[?25h");
37
}
38
elseif(status==FALSE)
39
{
40
// ESC [ ? 25 l
41
vt100Escape();
42
uart_puts_P("[?25l");
43
}
44
}
45
46
voidvt100CursorUp(intval)
47
{
48
vt100Escape();
49
uart_putc('[');
50
itoa(val,BUFF,5);
51
uart_puts(BUFF);
52
uart_putc('A');
53
}
54
55
voidvt100CursorDown(intval)
56
{
57
vt100Escape();
58
uart_putc('[');
59
itoa(val,BUFF,5);
60
uart_puts(BUFF);
61
uart_putc('B');
62
}
63
64
voidvt100CursorForward(intval)
65
{
66
vt100Escape();
67
uart_putc('[');
68
itoa(val,BUFF,5);
69
uart_puts(BUFF);
70
uart_putc('C');
71
}
72
73
voidvt100CursorBackward(intval)
74
{
75
vt100Escape();
76
uart_putc('[');
77
itoa(val,BUFF,5);
78
uart_puts(BUFF);
79
uart_putc('D');
80
}
81
82
voidvt100CursorPosition(introw,intcol)
83
{
84
vt100Escape();
85
uart_putc('[');
86
itoa(row,BUFF,5);
87
uart_puts(BUFF);
88
uart_putc(';');
89
itoa(col,BUFF,5);
90
uart_puts(BUFF);
91
uart_putc('f');
92
}
93
94
voidvt100CursorSave(void)
95
{
96
// ESC [s
97
vt100Escape();
98
uart_puts_P("[s");
99
}
100
101
voidvt100CursorRestore(void)
102
{
103
// ESC [u
104
vt100Escape();
105
uart_puts_P("[u");
106
}
107
108
voidvt100CursorSaveAttr(void)
109
{
110
// ESC [7
111
vt100Escape();
112
uart_puts_P("[7");
113
}
114
115
voidvt100CursorRestoreAttr(void)
116
{
117
// ESC [8
118
vt100Escape();
119
uart_puts_P("[8");
120
}
121
122
voidvt100ScrollEnable(void)
123
{
124
ESC[r
125
vt100Escape();
126
uart_puts_P("[r");
127
}
128
129
voidvt100ScrollScreen(intstart,intend)
130
{
131
vt100Escape();
132
uart_putc('[');
133
itoa(start,BUFF,5);
134
uart_puts(BUFF);
135
uart_putc(';');
136
itoa(end,BUFF,5);
137
uart_puts(BUFF);
138
uart_putc('r');
139
}
140
141
voidvt100ScrollDown(void)
142
{
143
// ESC[D
144
vt100Escape();
145
uart_putc('D');
146
}
147
148
voidvt100ScrollUp(void)
149
{
150
// ESC[M
151
vt100Escape();
152
uart_putc('M');
153
}
154
155
voidvt100SetAttr(intattrib)
156
{
157
vt100Escape();
158
uart_putc('[');
159
itoa(attrib,BUFF,5);
160
uart_puts(BUFF);
161
uart_putc('m');
162
}
Nachdem Serial.begin(...); muss vt100Init(); aufgerufen werden, um das
Terminalprogram in den richtigen Modus zu setzen und dann koennen die
Funktionen benutzt werden um den Cursor zu steuern.