web-dev-qa-db-de.com

Bildschirm des Terminals löschen?

Ich lese Daten von 9 verschiedenen Sensoren für meinen Roboter und muss sie alle im gleichen Fenster anzeigen, damit ich die Werte vergleichen und sehen kann, ob eine der Messwerte deaktiviert ist.

Das Problem, das ich sowohl mit Serial.print als auch mit lcd.print habe, ist, dass sich die Werte ständig bewegen, und ich kann sie beim Bewegen des Roboters nicht wirklich gut sehen.

Ich dachte daran, etwas wie Serial.clear () anzurufen, bevor irgendetwas anderes angezeigt wird, und das würde die Dinge nur an einem Ort halten und nur die Werte ändern.

Soweit ich es bisher gefunden habe, wird beispielsweise Serial.print (17, BYTE) nicht mehr unterstützt (Aufruf der ESC-Taste).

Also ... für diejenigen, die etwas mehr Erfahrung mit Arduino haben ... wie kann ich das richtig machen?

14
Eugen

Der serielle Monitor von Arduino ist kein normales Terminal, daher kann der Bildschirm nicht mit Standard-Terminalbefehlen gelöscht werden. Ich schlage vor, einen tatsächlichen Terminal-Emulator wie PuTTY zu verwenden.

Der Befehl zum Löschen eines Terminalbildschirms lautet ESC [2J

Um in Arduino-Code zu erreichen:

  Serial.write(27);       // ESC command
  Serial.print("[2J");    // clear screen command
  Serial.write(27);
  Serial.print("[H");     // cursor to home command

Quelle:
http://www.instructables.com/id/A-Wireless-Controlled-Arduino-Powered-Message-B/step6/Useful-Code-Exlaced-Clearing-a-Serial-Terminal/

30
jjz

Es gibt keine Möglichkeit, den Bildschirm zu löschen, aber eine wirklich einfache Möglichkeit zum Fälschen kann so viele Serial.println();-Druckvorgänge enthalten, wie Sie benötigen, um alle alten Daten vom Bildschirm fernzuhalten.

7
uDalillu

Ich habe festgestellt, dass ASCII 12 einen Form-Feed erstellt, das ist eine neue Seite. Hier ist eine Wikipedia-Definition

"Der Formularvorschub ist ein seitenbrechendes ASCII - Steuerzeichen. Er zwingt den -Drucker, die aktuelle Seite auszuwerfen und den Druckvorgang am oberen

Der Code lautet

Serial.write(12);

Arduino Terminate unterstützt nicht das Zeichen, aber PuTTY ein leichter Open-Source-Telnet-Client kann dies

Ein Beispiel für den Code 

void setup() {
  Serial.begin(9600);//Initializase the serial transmiter speed

}

void loop() {
    //Code tested with PuTTY terminal

    Serial.write(12);//ASCII for a Form feed
    Serial.println("This is the title of a new page");// your code

    delay(500);//delay for visual
    }

Du könntest es versuchen:

Serial.write(13);

Welches ist ein Wagenrücklauf, der bei jeder Iteration zum Anfang der Zeile zurückkehrt. (Besonders wenn alles eine feste Breite hat).

3
Creasote

Fand einen dummen einfachen Weg, um dieses Problem zu beheben. Ändern Sie die Größe des Terminal-Fensters auf nur eine Zeile hoch und es wird viel einfacher zu lesen sein!

2
Dok Collict

ESC ist das Zeichen _ 2 _ 7, nicht _ 1 _ 7. Sie können auch Dezimal 12 (auch bekannt als FF, Formular-Feed) versuchen.

Beachten Sie, dass alle diese Sonderzeichen nicht vom Arduino, sondern vom Programm auf der Empfängerseite verarbeitet werden. Ein Standard-Unix-Terminal (xterm, gnome-terminal, kterm, ...) behandelt also andere Steuerungssequenzen als ein Windows-Terminalprogramm wie HTerm. 

Daher sollten Sie genau angeben, welches Programm Sie genau zur Anzeige verwenden. Danach können Sie sagen, welche Steuerzeichen und Steuersequenzen verwendet werden können.

1
A.H.

die beste Möglichkeit, die ich mir vorstellen kann, ist die Verwendung von Processing Es gibt ein paar Einführungen im Netz wie Anzeige serieller Daten , Arduino-Grafik und Arduino-Radar
Da Arduino auf der Verarbeitung basiert, ist es nicht schwer zu lernen

1
Sibster

Es ist nicht möglich, das Serial Monitor-Fenster basierend auf eingehenden seriellen Daten zu löschen.

Ich kann mir ein paar Optionen vorstellen, die einfachste (und cheatiest) ist die Verwendung von println() mit einer von Ihnen generierten Zeichenfolge mit fester Breite, die Ihre Sensordaten enthält. 

Das Kontrollkästchen Autoscroll des seriellen Monitors der Arduino IDE bedeutet, wenn Sie die Zeichenfolge mit fester Breite dauerhaft senden (möglicherweise mit einer Verzögerung von 500 ms), wird der Eindruck erweckt, dass die Aktualisierung erfolgt, sobald sie unten ist und zu scrollen beginnt. Sie können auch die Höhe des Fensters verkleinern, damit es so aussieht, als hätte es nur eine Zeile.

Um einen String mit fester Breite zu erreichen, der für serielle println() geeignet ist, benötigen Sie Funktionen, um Ihre Sensorwerte in Strings umzuwandeln und sie auf eine dauerhafte Größe zu setzen. Verketten Sie dann die Werte miteinander (einschließlich Trennzeichen, wenn die Daten dadurch leichter lesbar sind)

Eine Ausgabe von etwas ähnlichem ist das, was ich anspreche: 

| 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 |

Alles in allem ist dies keine großartige Lösung, aber es würde Ihnen ein Ergebnis bringen.

Eine weitaus klügere Idee ist, ein anderes Programm außerhalb von Arduino zu erstellen, und IDE überwacht den Com-Port auf Sensorwerte, die vom Arduino gesendet werden. Ihr Arduino-Programm muss eine Nachricht senden, die Ihr externes Programm eindeutig interpretieren kann, z. B. 1=0.5;, wobei 1 = Sensor-ID und 0,5 = Sensorwert. Das externe Programm würde dann diese Werte beibehalten (1 für jeden Sensor). Das externe Programm kann diese Informationen dann auf beliebige Weise anzeigen. Eine Konsole-Ausgabe wäre relativ einfach zu erreichen :-)

C# hat die serialport-Klasse von .NET, die zu verwenden eine Freude ist. (meistens!)

Python hat ein Modul namens pyserial, das auch einfach großartig ist.

Jede Sprache gibt Ihnen eine wesentlich bessere Kontrolle über die Konsolenausgabe, falls Sie sich für diesen Vorgang entscheiden.

1
jon

Wenn Sie beispielsweise die Baudrate vor und zurück wechseln, wird das Serial Monitor-Fenster in Version 1.5.3 von Arduino IDE für die Intel Galileo-Entwicklung gelöscht

1
Gökhan Kurt

Noch ein Tritt an der Dose:

void setup(){     /*123456789 123456789 123456789 123456789 123*/
  String newRow="\n|________________________________________";
  String scrSiz="\n|\n|\n|\n|\n|\n|\n|\n|\n|\t";
  Serial.begin(115200);  
       // this baudrate should not have flicker but it does as seen when
       // the persistence of vision threshold is insufficiently exceeded
       // 115200 baud should display ~10000 cps or a char every 0.1 msec
       // each 'for' loop iteration 'should' print 65 chars. in < 7 msec
       // Serial.print() artifact inefficiencies are the flicker culprit
       // unfortunately '\r' does not render in the IDE's Serial Monitor

  Serial.print( scrSiz+"\n|_____ size screen vertically to fit _____"  );
  for(int i=0;i<30;i++){
     delay(1000); 
     Serial.print((String)scrSiz +i +"\t" + (10*i) +newRow);}
}
void loop(){}
1
rEKIMcarnate

sie sind hier, um Informationen zu erhalten, die in einer bestimmten Reihenfolge angezeigt werden. Weitere Informationen erhalten Sie hier

Drucken Sie alle Daten in einer Zeile, so dass Sie Zeilen mit den Daten haben, die Sie benötigen. Ich löse einfach das gleiche Problem. Stellen Sie einfach sicher, dass Sie eine konstante Datengröße und einen konstanten Abstand zwischen den Signalen hatten

Serial.print("cuenta q2: ");
Serial.print( cuenta_pulsos_encoder_1,3);
Serial.print("\t");
Serial.print(q2_real,4);
Serial.print("\t");
Serial.print("cuenta q3: ");
Serial.print( cuenta_pulsos_encoder_2,3);
Serial.print("\t");
Serial.print(q3_real,4);
Serial.print("\t");
Serial.print("cuenta q4: ");
Serial.print( cuenta_pulsos_encoder_3,3);
Serial.print("\t");
Serial.println(q4_real,4);

Ich habe diesen simple function gemacht, um dies zu erreichen:

void clearscreen() { 
    for(int i=0;i<10;i++) {
        Serial.println(\n\n\n\n\n\n\n\n\n\n\n\n\n);
    }
}

Es funktioniert gut für mich im default terminal

0
Ravi Shekhar

Wenn einer von euch ein virtuelles Terminal in Proteus verwendet und es löschen möchte, fügt einfach Serial.write (0x0C) hinzu. und es wird gut funktionieren

0

Sie könnten einfach tun:

Serial.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

oder wenn du willst:

for (int i=0; i<100; i++) {
   Serial.print("\n");
}
0
theQuestionMan