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 | void loop() |
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.
Wenn serial.print das \r aus dem String "\ra" raus filtert, dann kannst du die serial.write funktion probieren.
1 | void loop() |
2 | {
|
3 | Serial.write("\ra"); |
4 | delay(1000); |
5 | Serial.write("\rb"); |
6 | delay(1000); |
7 | }
|
Ich kann mir das aber nicht vorstellen, dass \r rausgenommen wird. Hier ist ein Beispiel mit einem solchen \r: http://www.underwater.ca/blog/arduino-to-max-msp
1 | void loop() |
2 | {
|
3 | Serial.print("\r"); |
4 | Serial.print("a"); |
5 | delay(1000); |
6 | Serial.print("\r"); |
7 | Serial.print("b"); |
8 | delay(1000); |
9 | }
|
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?
Stefan B. schrieb: > BTW. Arbeitest du mit einem Mac? Es gibt auch schöne Terminalprogramme fürn Apfel. GoSerial(ist keine echte VT100-Emulation, versteht aber Steuerzeichen): http://www.furrysoft.de/?page=goserial CoolTerm: http://www.macupdate.com/app/mac/31352/coolterm Oder zu Fuß im Terminal: http://etherealmind.com/serial-console-on-osx/ mfg mf
Das ich mit
1 | Serial.println |
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 | char BUFF[5]; |
2 | |
3 | void vt100Escape(void) |
4 | {
|
5 | // ESC
|
6 | uart_putc(27); |
7 | }
|
8 | void vt100Init(void) |
9 | {
|
10 | // initializes terminal to "power-on" settings
|
11 | // ESC c
|
12 | vt100Escape(); |
13 | uart_putc('c'); |
14 | }
|
15 | |
16 | void vt100ClearScreen(void) |
17 | {
|
18 | // ESC [ 2 J
|
19 | vt100Escape(); |
20 | uart_puts_P("[2J"); |
21 | }
|
22 | |
23 | void vt100Home(void) |
24 | {
|
25 | // ESC [ H
|
26 | vt100Escape(); |
27 | uart_puts_P("[H"); |
28 | }
|
29 | |
30 | void vt100SetCursorMode(uint8_t status) |
31 | {
|
32 | if(status == TRUE ) |
33 | {
|
34 | // ESC [ ? 25 h
|
35 | vt100Escape(); |
36 | uart_puts_P("[?25h"); |
37 | }
|
38 | else if(status == FALSE) |
39 | {
|
40 | // ESC [ ? 25 l
|
41 | vt100Escape(); |
42 | uart_puts_P("[?25l"); |
43 | }
|
44 | }
|
45 | |
46 | void vt100CursorUp(int val) |
47 | {
|
48 | vt100Escape(); |
49 | uart_putc('['); |
50 | itoa( val, BUFF, 5); |
51 | uart_puts(BUFF); |
52 | uart_putc('A'); |
53 | }
|
54 | |
55 | void vt100CursorDown(int val) |
56 | {
|
57 | vt100Escape(); |
58 | uart_putc('['); |
59 | itoa( val, BUFF, 5); |
60 | uart_puts(BUFF); |
61 | uart_putc('B'); |
62 | }
|
63 | |
64 | void vt100CursorForward(int val) |
65 | {
|
66 | vt100Escape(); |
67 | uart_putc('['); |
68 | itoa( val, BUFF, 5); |
69 | uart_puts(BUFF); |
70 | uart_putc('C'); |
71 | }
|
72 | |
73 | void vt100CursorBackward(int val) |
74 | {
|
75 | vt100Escape(); |
76 | uart_putc('['); |
77 | itoa( val, BUFF, 5); |
78 | uart_puts(BUFF); |
79 | uart_putc('D'); |
80 | }
|
81 | |
82 | void vt100CursorPosition(int row, int col) |
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 | void vt100CursorSave(void) |
95 | {
|
96 | // ESC [s
|
97 | vt100Escape(); |
98 | uart_puts_P("[s"); |
99 | }
|
100 | |
101 | void vt100CursorRestore(void) |
102 | {
|
103 | // ESC [u
|
104 | vt100Escape(); |
105 | uart_puts_P("[u"); |
106 | }
|
107 | |
108 | void vt100CursorSaveAttr(void) |
109 | {
|
110 | // ESC [7
|
111 | vt100Escape(); |
112 | uart_puts_P("[7"); |
113 | }
|
114 | |
115 | void vt100CursorRestoreAttr(void) |
116 | {
|
117 | // ESC [8
|
118 | vt100Escape(); |
119 | uart_puts_P("[8"); |
120 | }
|
121 | |
122 | void vt100ScrollEnable(void) |
123 | {
|
124 | ESC [r |
125 | vt100Escape(); |
126 | uart_puts_P("[r"); |
127 | }
|
128 | |
129 | void vt100ScrollScreen(int start, int end) |
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 | void vt100ScrollDown(void) |
142 | {
|
143 | // ESC[D
|
144 | vt100Escape(); |
145 | uart_putc('D'); |
146 | }
|
147 | |
148 | void vt100ScrollUp(void) |
149 | {
|
150 | // ESC[M
|
151 | vt100Escape(); |
152 | uart_putc('M'); |
153 | }
|
154 | |
155 | void vt100SetAttr(int attrib) |
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.
...du suchst: http://www.mikrocontroller.net/articles/MCURSES Beitrag "MCURSES - Mini Curses Bibliothek für Mikrocontroller" Grüße Uwe
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.