Forum: Mikrocontroller und Digitale Elektronik Arduino Problem - Serial Monitor


von ChristianK (Gast)


Lesenswert?

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ß

von Oliver J. (skriptkiddy)


Lesenswert?

Bitte Frage präziser formulieren.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von ChristianK (Gast)


Lesenswert?

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ß

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> 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.

von ChristianK (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von ChristianK (Gast)


Lesenswert?

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ß

von Sascha (Gast)


Lesenswert?

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?

von Achim M. (minifloat)


Lesenswert?

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

von Leser (Gast)


Lesenswert?

Hi, Du suchst den Befehl

Serial.println("a");

& Gruß

von Sascha (Gast)


Lesenswert?

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

von Stephan K. (stephan_k)


Lesenswert?

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.

von uwe (Gast)


Lesenswert?


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
Noch kein Account? Hier anmelden.