www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arduino Problem - Serial Monitor


Autor: ChristianK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte Frage präziser formulieren.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ChristianK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?
void loop()
{
  Serial.print("\ra");
  delay(1000);
  Serial.print("\rb");
  delay(1000);
}

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.

Autor: ChristianK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn serial.print das \r aus dem String "\ra" raus filtert, dann kannst 
du die serial.write funktion probieren.
void loop()
{
  Serial.write("\ra");
  delay(1000);
  Serial.write("\rb");
  delay(1000);
}

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
void loop()
{
  Serial.print("\r");
  Serial.print("a");
  delay(1000);
  Serial.print("\r");
  Serial.print("b");
  delay(1000);
}

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

Autor: ChristianK (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Leser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Du suchst den Befehl

Serial.println("a");

& Gruß

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ich mit
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

Autor: Stephan K. (stephan_k)
Datum:

Bewertung
0 lesenswert
nicht 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.
char BUFF[5];

void vt100Escape(void)
{
//  ESC
  uart_putc(27);
}
void vt100Init(void)
{
  // initializes terminal to "power-on" settings
  // ESC c
  vt100Escape();
  uart_putc('c');
}

void vt100ClearScreen(void)
{
  // ESC [ 2 J
  vt100Escape();
  uart_puts_P("[2J");
}

void vt100Home(void)
{
        // ESC [ H
  vt100Escape();
  uart_puts_P("[H");
}

void vt100SetCursorMode(uint8_t status)
{
  if(status == TRUE )
  {
  // ESC [ ? 25 h
  vt100Escape();
  uart_puts_P("[?25h");
  }
  else if(status == FALSE)
  {
      // ESC [ ? 25 l
  vt100Escape();
  uart_puts_P("[?25l");
  }
}

void vt100CursorUp(int val)
{
  vt100Escape();
  uart_putc('[');
  itoa( val, BUFF, 5);
  uart_puts(BUFF);
  uart_putc('A');
}

void vt100CursorDown(int val)
{
  vt100Escape();
  uart_putc('[');
  itoa( val, BUFF, 5);
  uart_puts(BUFF);
  uart_putc('B');
}

void vt100CursorForward(int val)
{
  vt100Escape();
  uart_putc('[');
  itoa( val, BUFF, 5);
  uart_puts(BUFF);
  uart_putc('C');
}

void vt100CursorBackward(int val)
{
  vt100Escape();
  uart_putc('[');
  itoa( val, BUFF, 5);
  uart_puts(BUFF);
  uart_putc('D');
}

void vt100CursorPosition(int row, int col)
{
  vt100Escape();
  uart_putc('[');
  itoa( row, BUFF, 5);
  uart_puts(BUFF);
  uart_putc(';');
  itoa( col, BUFF, 5);
  uart_puts(BUFF);
  uart_putc('f');
}

void vt100CursorSave(void)
{
  // ESC [s
  vt100Escape();
  uart_puts_P("[s");
}

void vt100CursorRestore(void)
{
  // ESC [u
  vt100Escape();
  uart_puts_P("[u");
}

void vt100CursorSaveAttr(void)
{
  // ESC [7
  vt100Escape();
  uart_puts_P("[7");
}

void vt100CursorRestoreAttr(void)
{
  // ESC [8
  vt100Escape();
  uart_puts_P("[8");
}

void vt100ScrollEnable(void)
{
  ESC [r
  vt100Escape();
  uart_puts_P("[r");
}

void vt100ScrollScreen(int start, int end)
{
  vt100Escape();
  uart_putc('[');
  itoa( start, BUFF, 5);
  uart_puts(BUFF);
  uart_putc(';');
  itoa( end, BUFF, 5);
  uart_puts(BUFF);
  uart_putc('r');
}

void vt100ScrollDown(void)
{
  // ESC[D
  vt100Escape();
  uart_putc('D');
}

void vt100ScrollUp(void)
{
  // ESC[M
  vt100Escape();
  uart_putc('M');
}

void vt100SetAttr(int attrib)
{
  vt100Escape();
  uart_putc('[');
  itoa( attrib, BUFF, 5);
  uart_puts(BUFF);
  uart_putc('m');
}

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.

Autor: uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.