2012-04-11 24 views
10

Odczytuję dane z 9 różnych czujników dla mojego robota i muszę wyświetlać je wszystkie stabilnie, w tym samym oknie, aby móc porównać wartości i sprawdzić, czy któryś z odczytów jest wyłączony.Czyszczenie ekranu terminala?

Problem, który mam z serią Serial.print i lcd.print polega na tym, że wartości nieustannie się poruszają i nie mogę naprawdę dobrze im się przyjrzeć podczas przesuwania robota.

Zastanawiałem się nad wywołaniem czegoś takiego jak Serial.clear() przed wyświetleniem czegokolwiek innego, co utrzymywałoby wszystko w jednym miejscu, zmieniając tylko wartości.

Z tego, co znalazłem do tej pory, Serial.print (17, BYTE) na przykład nie jest już obsługiwany (wywołanie klawisza ESC).

Więc ... dla osób z odrobiną doświadczenia Arduino ... jaki jest właściwy sposób na zrobienie tego?

Odpowiedz

25

Monitor szeregowy Arduino nie jest zwykłym terminalem, więc nie można wyczyścić ekranu za pomocą standardowych poleceń terminalu. Sugeruję użycie rzeczywistego emulatora terminala, takiego jak Putty.

Polecenie do kasowania ekranie terminala jest ESC [2J

osiągnąć w kodzie Arduino:

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

Źródło:
http://www.instructables.com/id/A-Wirelessly-Controlled-Arduino-Powered-Message-B/step6/Useful-Code-Explained-Clearing-a-Serial-Terminal/

1

ESC jest charakter _ _7, nie _ _7. Możesz również spróbować dziesiętnych 12 (aka .FF, feed formularza).

Należy pamiętać, że wszystkie te znaki specjalne nie są obsługiwane przez Arduino, ale przez program po stronie odbiorczej. Zatem standardowy terminal Unix (xterm, gnome-terminal, kterm, ...) obsługuje inny zestaw sekwencji kontrolnych, a następnie mówi program terminalowy Windows, taki jak HTerm.

Dlatego należy określić, który program jest używany do wyświetlania. Po tym można powiedzieć, jakie znaki kontrolne i sekwencje kontrolne są użyteczne.

+0

używam najbardziej podstawowy, standardowy Arduino IDE (nawet Eclipse C++ jeszcze) i jego dołączonego złącza szeregowego w systemie Windows maszynie 7 64bit: D – Eugen

+0

spróbuj wysłać Wysuw ' 0xC' i użyj putty jako terminalu szeregowego. – Sibster

1

Nie można wyczyścić okna Serial Monitor na podstawie przychodzących danych szeregowych.

Mogę wymyślić kilka opcji, najprostsze (i najśmieszniejsze) jest użycie println() z ciągiem o stałej szerokości, który został wygenerowany i zawiera dane z czujnika.

Pole wyboru Arduino IDE Serial Monitor's Autoscroll oznacza, że ​​ciągłe wysyłanie łańcucha o stałej szerokości (z opóźnieniem wynoszącym 500ms) spowoduje wrażenie, że aktualizuje się, gdy dojdzie do dna i zacznie się przewijać. Możesz także zmniejszyć wysokość okna, aby wyglądało, że ma tylko jedną linię.

Aby uzyskać ciąg o stałej szerokości, który jest odpowiedni dla numeru seryjnego println(), potrzebne będą funkcje do konwertowania wartości czujników na ciągi, a także ich obcinania/przycinania do trwałego rozmiaru. Następnie złączyć ze sobą (w tym wartości separatorów jeśli to sprawia, że ​​dane łatwiejsze do odczytania)

wyjście z czegoś podobnego do tego, co mam jest sugerując:

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

wszystko pod uwagę, to ISN” t świetne rozwiązanie, ale przyniesie ci to efekt.

Dużo mądrzejszym pomysłem jest zbudowanie innego programu poza Arduino i jego IDE, który nasłuchuje portu komunikacyjnego dla wartości czujników wysyłanych z Arduino.Twój program Arduino będzie musiał wysłać wiadomość, którą Twój zewnętrzny program może jednoznacznie zinterpretować, np. 1=0.5; gdzie 1 = identyfikator czujnika i 0,5 = wartość czujnika. Zewnętrzny program zachowałby te wartości (1 dla każdego czujnika). Program zewnętrzny można następnie wyświetlić tę informację w jakikolwiek sposób, który chcesz, to miłe wyjście konsola będzie stosunkowo łatwe do osiągnięcia :-)

C# ma .NET „s serialport klasa która jest przyjemność. (przez większość czasu!)

Python ma moduł o nazwie pyserial, który również jest łatwy w obsłudze.

Każdy język zapewni znacznie większą kontrolę nad wyjściami konsoli, jeśli zdecydujesz się na ten sposób.

+0

WWW ... OW! Nie myślałem, że wyczyszczenie ekranu oznaczałoby tyle pracy. Wielkie dzięki, spróbuję tego jutro i skontaktuję się z Tobą, jeśli napotkam jakiekolwiek problemy. – Eugen

7

Nie ma sposobu na wyczyszczenie ekranu, ale naprawdę prostym sposobem na sfałszowanie może być wydrukowanie tak dużej ilości informacji, jak Serial.println();, ponieważ zachodzi potrzeba usunięcia wszystkich starych danych z ekranu.

3

można spróbować:

Serial.write(13); 

który zapewni powrót karetki, wracając do początku linii każdej iteracji - co należy zrobić, czego gonić? (Zwłaszcza, jeśli wszystko ma ustaloną szerokość).

2

Znaleziono Głupio prosty sposób na rozwiązanie tego problemu . Po prostu zmień rozmiar okna terminala na jedyne 1 linię, co znacznie ułatwi czytanie!

+1

Nie możliwe lol. Minimalny rozmiar okna wynosi dla mnie około 10 linii (Windows). – C4u

1

Jeśli na przykład zmienić szybkość transmisji iz powrotem czyści okno Serial Monitor w wersji 1.5.3 z Arduino IDE dla rozwoju 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

I odkryli, że ASCII 12 uczynić kanał Form to jest nowa strona. tutaj jest definicja wikipedii

"Przesunięcie strony jest łamiącym strony znakiem kontrolnym ASCII.Zmusza drukarkę wysunąć bieżącą stronę i kontynuować drukowanie na najwyższym innego”

kod jest

Serial.write(12); 

Arduino Kończy nie obsługuje charakter ale Putty lekki klient Telnet o otwartym kodzie źródłowym może to zrobić

Przykład kodu

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

Terminale nie są drukarkami. Zdarza się, że działa z putty, ale zobacz [xterm FAQ] (http://invisible-island.net/xterm/xterm.faq.html#xterm_form_feed). –

1

Kolejna akcja w puszce:

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

Można po prostu zrobić:

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

lub jeśli chcesz:

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

Zrobiłem ten simple function do osiągnięcia tego celu:

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

To działa dobrze dla mnie w default terminal