Очистка экрана терминала?

Я читаю данные из 9 различных датчиков для своего робота, и мне нужно постоянно их отображать в том же окне, чтобы я мог сравнивать значения и видеть, выключено ли какое-либо из показаний.

Проблема, с которой я столкнулась как с Serial.print, так и с lcd.print, заключается в том, что значения постоянно движутся, и я не могу действительно хорошо смотреть на них при перемещении робота.

Я подумывал назвать что-то вроде Serial.clear() перед тем, как отобразить что-нибудь еще, и это будет просто держать вещи устойчивыми и в одном месте, изменяя только значения.

Из того, что я нашел до сих пор, Serial.print(17, BYTE), например, больше не поддерживается (вызов клавиши ESC).

Итак... для тех, у кого немного больше опыта Arduino... Каков правильный способ сделать это?

Ответ 1

Последовательный монитор Arduino не является обычным терминалом, поэтому его невозможно очистить с помощью стандартных команд терминала. Я предлагаю использовать настоящий эмулятор терминала, например Putty.

Команда для очистки экрана терминала: ESC [2J

Чтобы выполнить код Arduino:

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

Источник:
http://www.instructables.com/id/A-Wirelessly-Controlled-Arduino-Powered-Message-B/step6/Useful-Code-Explained-Clearing-a-Serial-Terminal/

Ответ 2

Невозможно очистить экран, но очень простой способ подделать его можно печатать как можно больше Serial.println();, поскольку вам нужно оставить все старые данные на экране.

Ответ 3

Я обнаружил, что ASCII 12 создает фид формы, это новая страница. вот определение википедии

"Подача формы - это управляющий текст ASCII-страницы. принтера для извлечения текущей страницы и продолжения печати вверху другого"

Код

Serial.write(12);

Arduino Terminate не поддерживает символ, но Putty, это может сделать легкий клиент telnet с открытым исходным кодом

Пример кода

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
    }

Ответ 4

Вы можете попробовать:

Serial.write(13);

Что обеспечит возврат каретки, возвращаясь к началу строки на каждой итерации - что должно делать то, что вы преследуете? (Особенно, если все фиксированная ширина).

Ответ 5

Нашел глупо простой способ исправить эту проблему. Просто измените размер окна терминала только на 1 строку, и это будет намного легче читать!

Ответ 7

ESC - это символ _2_7, а не _1_7. Вы также можете попробовать десятичное число 12 (иначе, FF, фид формы).

Обратите внимание, что все эти специальные символы не обрабатываются Arduino, а программой на принимающей стороне. Таким образом, стандартный терминал Unix (xterm, gnome-terminal, kterm,...) обрабатывает другой набор управляющих последовательностей, а затем говорит о терминальной программе Windows, такой как HTerm.

Поэтому вы должны указать, какую программу вы используете для отображения. После этого можно сказать вам, какие управляющие символы и управляющие последовательности могут использоваться.

Ответ 8

Невозможно очистить окно Serial Monitor на основе входящих серийных данных.

Я могу придумать пару вариантов, самый простой (и самый модный) - использовать println() с строкой фиксированной ширины, которую вы создали, содержащей данные вашего датчика.

Флажок Arduino IDE Serial Monitor Autoscroll означает, что если вы настойчиво отправляете строку с фиксированной шириной (возможно, с задержкой в ​​500 мс), это создаст впечатление, что она будет обновляться после того, как она будет снижаться и начнет прокрутку. Вы также можете уменьшить высоту окна, чтобы он выглядел так, будто он имеет только одну строку.

Чтобы выполнить строку с фиксированной шириной, подходящую для последовательного println(), вам понадобятся функции для преобразования значений вашего датчика в строки, а также прокладки/обрезка их до постоянного размера. Затем объедините значения вместе (включая разделители, если они упрощают чтение данных)

Результат чего-то похожего на то, о чем я намекаю:

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

Все рассмотренные вещи, это не отличное решение, но это принесет вам результат.

Более разумная идея состоит в том, чтобы построить еще одну программу за пределами Arduino и ее IDE, которая слушает com-порт для значений датчиков, отправленных из Arduino. Ваша программа Arduino должна будет отправить сообщение, которое ваша внешняя программа может однозначно интерпретировать, например, 1=0.5; где 1 = идентификатор датчика и 0,5 = значение датчика. Внешняя программа сохранит эти значения (1 для каждого датчика). Внешняя программа может затем отображать эту информацию любым способом, какой бы вы ни хотели, хороший выход консоли был бы относительно легко достигнут: -)

C# имеет класс .NET serialport, который приятно использовать. (большую часть времени!)

Python имеет модуль под названием pyserial, который также очень велик.

Любой язык даст вам гораздо больший контроль над выходом консоли, если вы решите продолжить этот путь.

Ответ 9

Если вы меняете скорость передачи, например, назад и вперед, она очищает окно Serial Monitor в версии 1.5.3 от Arduino IDE для разработки Intel Galileo.

Ответ 10

Еще один удар в банке:

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

Ответ 11

Вы можете просто сделать:

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

или если вы хотите:

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

Ответ 12

Я сделал эту simple function для достижения этой цели:

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

Это хорошо работает для меня в default terminal по default terminal

Ответ 13

заключать в ряды по отношению к определенным признакам, как правило, переменные и значения переменной

Выведите все данные в строку, чтобы у вас были строки с нужными вам данными, я просто решил ту же проблему, что и эта, просто сделайте так, чтобы у вас был постоянный размер данных и расстояние между ними, я сделал это

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

Ответ 14

Если один из вас, ребята, использует виртуальный терминал в Proteus и хочет очистить его, просто добавьте Serial.write(0x0C); и это будет работать нормально

Ответ 15

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

  }