2012-04-11 27 views
10

Sto leggendo i dati di 9 diversi sensori per il mio robot e ho bisogno di visualizzarli tutti costantemente, nella stessa finestra in modo da poter confrontare i valori e vedere se qualcuna delle letture è disattivata.Cancellare lo schermo del terminale?

Il problema che sto riscontrando con Serial.print e lcd.print è che i valori sono in costante movimento e non riesco a vederli bene mentre si sposta il robot.

Stavo pensando di chiamare qualcosa come Serial.clear() prima di mostrare qualcos'altro e che manterrebbe le cose ferme e in un posto, cambiando solo i valori.

Da quanto ho trovato finora, Serial.print (17, BYTE) per esempio non è più supportato (Chiamando il tasto ESC).

Quindi ... per chi ha un po 'più di esperienza Arduino ... qual è il modo corretto per farlo?

risposta

25

Il monitor seriale Arduino non è un terminale regolare in modo non la sua possibile cancellare lo schermo utilizzando i comandi da terminale standard. Ti suggerisco di usare un vero emulatore di terminale, come Putty.

Il comando per l'eliminazione di uno schermo del terminale è ESC [2J

Per realizzare in codice di Arduino:

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

Fonte:
http://www.instructables.com/id/A-Wirelessly-Controlled-Arduino-Powered-Message-B/step6/Useful-Code-Explained-Clearing-a-Serial-Terminal/

1

ESC è il carattere _ _7, non _ _7. Puoi anche provare decimale 12 (ovvero FF, form feed).

Si noti che tutti questi caratteri speciali non sono gestiti da Arduino ma dal programma sul lato ricevente. Quindi un terminale Unix standard (xterm, gnome-terminal, kterm, ...) gestisce un diverso insieme di sequenze di controllo, quindi dice un programma terminale Windows come HTerm.

Pertanto è necessario specificare quale programma si utilizza esattamente per la visualizzazione. Dopodiché è possibile dirti quali caratteri di controllo e sequenze di controllo sono utilizzabili.

+0

sto usando il più fondamentale, Arduino IDE standard (nemmeno Eclipse C++ ancora) e il suo terminale seriale incluso su una macchina 7 a 64 bit di Windows: D – Eugen

+0

provare l'invio Formfeed ' 0xC' e usa lo stucco come terminale seriale. – Sibster

1

Non è possibile cancellare la finestra del monitor seriale in base ai dati seriali in entrata.

Posso pensare a un paio di opzioni, la più semplice (e più corposa) è quella di utilizzare println() con una stringa di larghezza fissa che hai generato che contiene i dati del sensore.

La casella di controllo del monitor seriale IDE Arduino Autoscroll significa che se si invia in modo persistente la stringa di larghezza fissa (con un ritardo di 500 ms), si avrà l'impressione che si stia aggiornando quando raggiunge il fondo e inizia a scorrere. Potresti anche ridurre l'altezza della finestra per far sembrare che abbia solo una linea.

Per eseguire una stringa di larghezza fissa adatta per il numero di serie println(), sono necessarie funzioni per convertire i valori del sensore in stringhe, nonché per eseguire il rilievo/ridimensionamento su una dimensione persistente. Poi concatenare i valori insieme (compresi i loro separatori se rende i dati più facili da leggere)

Un'uscita di qualcosa di simile a questo è quello che sto accennando a:

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

Tutto considerato, questo isn' t un'ottima soluzione ma ti farebbe ottenere un risultato.

Un'idea molto più intelligente è quella di creare un altro programma all'esterno di Arduino e l'IDE che ascolta la porta com per i valori dei sensori inviati da Arduino.Il tuo programma Arduino dovrà inviare un messaggio che il tuo programma esterno può interpretare in modo univoco, ad esempio 1=0.5; dove 1 = ID sensore e 0,5 = valore sensore. Il programma esterno manterrà quindi questi valori (1 per ciascun sensore). Il programma esterno può quindi visualizzare queste informazioni in qualsiasi modo si desidera, una bella uscita della console sarebbe relativamente facile da realizzare :-)

C# ha .NET s' serialport classe che è un piacere da usare. (La maggior parte del tempo!)

Python ha un modulo chiamato pyserial, che è anche facile grande.

Ciascuna lingua offre un controllo molto maggiore sull'output della console, se si sceglie di procedere in questo modo.

+0

WWW ... OW! Non pensavo che ripulire lo schermo avrebbe significato molto lavoro. Grazie mille amico, ci proverò domani e tornerò da te se dovessi avere problemi. – Eugen

7

Non c'è modo di svuotare lo schermo ma, un modo molto semplice per simularlo può essere la stampa di Serial.println(); in quanto è necessario mantenere tutti i vecchi dati fuori dallo schermo.

3

Si potrebbe provare:

Serial.write(13); 

che fornirà un ritorno a capo, tornando al punto di partenza della linea ad ogni iterazione - che dovrebbe fare quello che stai inseguendo? (Soprattutto se tutto è a larghezza fissa).

2

trovato un modo stupidamente semplice per risolvere questo problema . Ridimensiona la finestra del terminale a solo 1 riga in alto e sarà molto più facile da leggere!

+1

Non possibile lol. La dimensione minima della finestra è di circa 10 righe per me (Windows). – C4u

1

Se si cambia velocità di trasmissione per esempio avanti e indietro si cancella la finestra Monitor seriale nella versione 1.5.3 di Arduino IDE per lo sviluppo Intel Galileo

-1
/* 
As close as I can get to Clear Screen 

*/ 


void setup() { 
// put your setup code here, to run once: 
Serial.begin(115200); 

} 

void loop() { 

Serial.println("This is Line ZERO "); 

// put your main code here, to run repeatedly: 

for (int i = 1; i < 37; i++) 
{ 

// Check and print Line 
    if (i == 15) 
    { 
    Serial.println("Line 15"); 
    } 

    else 
    Serial.println(i); //Prints line numbers Delete i for blank line 
    } 

    delay(5000); 

    } 
5

Ho scoperto che ASCII 12 fanno un feed modulo , questa è una nuova pagina. ecco una definizione di wikipedia

"Il feed di modulo è un carattere ASCII di controllo della pagina.Costringe la stampante per espellere la pagina corrente e di continuare a stampare in cima di un altro"

Il codice è

Serial.write(12); 

Arduino Terminate non supporta il carattere ma Putty un client telnet open source leggero può farlo

Un esempio del codice

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 
    } 
+0

I terminali non sono stampanti. Capita di lavorare con lo stucco, ma vedi [Domande frequenti su xterm] (http://invisible-island.net/xterm/xterm.faq.html#xterm_form_feed). –

1

un altro calcio alla lattina:

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(){} 
0

Si può solo fare:

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

o se si desidera:

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

ho fatto questo simple function per raggiungere questo obiettivo:

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

Funziona bene per me in default terminal

Problemi correlati