Ștergerea ecranului terminalului? (Programare, Terminal, Arduino, Refresh, Șterge)

Eugen a intrebat.

Citesc date de la 9 senzori diferiți pentru robotul meu și am nevoie să le afișez pe toate în mod constant, în aceeași fereastră, astfel încât să pot compara valorile și să văd dacă vreuna dintre citiri este greșită.

Problema pe care o am atât cu Serial.print cât și cu lcd.print este că valorile se mișcă în mod constant și nu prea pot să mă uit bine la ele în timp ce mișc robotul.

Mă gândeam să apelez la ceva de genul Serial.clear() înainte de a afișa orice altceva și asta ar menține lucrurile stabile și la un loc, schimbând doar valorile.

Din ce am găsit până acum, Serial.print(17,BYTE) de exemplu, nu mai este suportat (Apelarea tastei ESC).

Deci… pentru cei cu ceva mai multă experiență Arduino… care este modul corect de a face acest lucru?

14 răspunsuri
jjz

Monitorul serial Arduino nu este un terminal obișnuit, deci nu este posibil să ștergeți ecranul folosind comenzi standard de terminal. Vă sugerez să folosiți un emulator de terminal real, cum ar fi Putty.

Comanda pentru a șterge ecranul unui terminal este ESC[2J

Pentru a realiza în codul Arduino:

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

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

uDalillu

Nu există nici o modalitate de a șterge ecranul, dar, o modalitate foarte ușoară de a falsifica acest lucru poate fi imprimând cât mai mult Serial.println(); cât aveți nevoie pentru a păstra toate datele vechi în afara ecranului.

Gustavo Adolfo Mejía

Am constatat că ASCII 12 face o Form feed, , adică o pagină nouă. Iată o definiție de pe wikipedia

„Form feed este un caracter de control ASCII de rupere a paginii. Acesta forțează imprimanta să ejecteze pagina curentă și să continue imprimarea în partea de sus a alteia”

Codul este următorul

Serial.write(12);

Arduino Terminate nu acceptă acest caracter dar Putty un client telnet open source ușor poate face acest lucru.

Un exemplu de cod

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
    }

Comentarii

  • Terminalele nu sunt imprimante. Se întâmplă să funcționeze cu Putty, dar vezi xterm FAQ. –  > Por Thomas Dickey.
Creasote

Ați putea încerca:

Serial.write(13);

Care va furniza o întoarcere de cărămidă, revenind la începutul liniei la fiecare iterație – ceea ce ar trebui să facă ceea ce urmărești? (Mai ales dacă totul este de lățime fixă).

Sibster

cea mai bună metodă la care mă pot gândi este folosirea procesare există câteva introduceri pe internet, cum ar fi afișarea datelor seriale, , graficul arduino și radarul arduino
Deoarece Arduino se bazează pe procesare, nu este atât de greu de învățat

A.H.

ESC este caracterul _2_7, nu _1_7. De asemenea, puteți încerca cu cifra zecimală 12 (aka. FF, form feed).

Rețineți că toate aceste caractere speciale nu sunt gestionate de Arduino, ci de programul de pe partea de recepție. Astfel, un terminal standard Unix (xterm, gnome-terminal, kterm, …) gestionează un set diferit de secvențe de control față de, de exemplu, un program terminal Windows, cum ar fi HTerm.

Prin urmare, ar trebui să specificați ce program utilizați exact pentru afișare. După aceea, este posibil să vă spunem ce caractere și secvențe de control sunt utilizabile.

Comentarii

  • Eu folosesc cel mai elementar și standard IDE Arduino (nici măcar Eclipse C++ încă) și terminalul serial inclus în acesta pe o mașină cu Windows 7 64bit 😀 –  > Por Eugen.
  • încercați să trimiteți Formfeed 0xC și folosiți putty ca terminal serial. –  > Por Sibster.
jon

Nu este posibil să ștergeți fereastra Serial Monitor pe baza datelor seriale primite.

Mă pot gândi la câteva opțiuni, cea mai simplă (și cea mai înșelătoare) este să folosiți println() cu un șir de caractere de lățime fixă pe care l-ați generat și care conține datele senzorilor.

În Arduino IDE Serial Monitor’s Serial Monitor’s Autoscroll înseamnă că, dacă trimiteți în mod persistent șirul de lățime fixă (cu o întârziere de 500ms, poate), acest lucru va da impresia că se actualizează odată ce ajunge în partea de jos și începe să se deruleze. De asemenea, ați putea micșora înălțimea ferestrei pentru a face să pară că are doar un singur rând.

Pentru a realiza un șir de caractere cu lățime fixă care să fie potrivit pentru seriale println() veți avea nevoie de funcții pentru a converti valorile senzorilor în șiruri, precum și pentru a le umple/taia la o dimensiune persistentă. Apoi, concatenați valorile împreună (inclusiv separatorii, dacă acest lucru face ca datele să fie mai ușor de citit)

O ieșire de ceva asemănător cu aceasta este ceea ce fac aluzie:

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

Toate lucrurile luate în considerare, aceasta nu este o soluție grozavă, dar v-ar obține un rezultat.

O idee mult mai inteligentă este să construiți un alt program în afara lui Arduino și a IDE-ului său, care să asculte portul com pentru valorile senzorilor trimise de Arduino. Programul Arduino va trebui să trimită un mesaj pe care programul extern să îl poată interpreta fără ambiguitate, ceva de genul 1=0.5; unde 1 = ID-ul senzorului și 0,5 = valoarea senzorului. Programul extern va păstra apoi aceste valori (1 pentru fiecare senzor). Programul extern poate apoi să afișeze aceste informații în orice mod doriți, o ieșire frumoasă de consolă ar fi relativ ușor de realizat 🙂

C# are .NET‘s serialport clasă care este o plăcere de utilizat. (de cele mai multe ori!)

Python are un modul numit pyserial, , care este, de asemenea, ușor de mare.

Oricare dintre cele două limbaje vă va oferi un control mult mai mare asupra ieșirii consolei, în cazul în care alegeți să procedați în acest fel.

Comentarii

  • WWW…OW! Nu credeam că ștergerea ecranului va însemna atât de multă muncă. Mulțumesc mult, amice, o să încerc mâine și o să te anunț dacă voi avea probleme. –  > Por Eugen.
Gökhan Kurt

Dacă schimbați baudrate, de exemplu, înainte și înapoi, se șterge fereastra Serial Monitor în versiunea 1.5.3 a Arduino IDE pentru dezvoltarea Intel Galileo

rEKIMcarnate

Încă o lovitură la cutie:

void setup(){     /*123456789 123456789 123456789 123456789 123*/
  String newRow="
|________________________________________";
  String scrSiz="
|
|
|
|
|
|
|
|
|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+"
|_____ 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(){}

theQuestionMan

Ați putea să faceți:

Serial.println("



















");

sau dacă doriți:

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

Manuel Estrada Ramos

imprime en linea los datos con un espaciado determinado, así tendrás columnas de datos de la misma variable y será más claro

Imprimați toate datele în linie, astfel încât să aveți rânduri cu datele de care aveți nevoie, am rezolvat aceeași problemă în acest fel, doar că trebuie să vă asigurați că ați alocat o dimensiune constantă a datelor și un spațiu între ele, am făcut acest lucru

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);

Comentarii

  • Vă mulțumim pentru contribuția la Stack Overflow. Vă rugăm să evitați limbile în afară de engleză, care este greu de înțeles pentru ceilalți. –  > Por Karthick Ramesh.
Abdeljalil HANOUB

Dacă unul dintre voi folosește terminalul virtual în proteus și dorește să îl ștergă, doar adăugați Serial.write(0x0C);și va funcționa bine

Ravi Shekhar

Am făcut acest lucru simple function pentru a realiza acest lucru:

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













");
    }
}

Acesta funcționează bine pentru mine în default terminal

Kevin Lilly
/*
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);  

  }