清除终端屏幕?

时间:2012-04-11 12:11:59

标签: terminal refresh arduino clear erase

我正在为我的机器人从9个不同的传感器读取数据,我需要在同一个窗口中稳定地显示它们,这样我就可以比较这些值并查看是否有任何读数。

我在Serial.print和lcd.print上遇到的问题是值不断移动,在移动机器人时我无法真正看到它们。

我想在显示其他内容之前调用类似Serial.clear()之类的东西,这样可以保持稳定并在一个地方只更改值。

从我到目前为止发现的,不再支持Serial.print(17,BYTE)(调用ESC键)。

所以......对于那些有更多Arduino经验的人来说......这样做的正确方法是什么?

15 个答案:

答案 0 :(得分:30)

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/

答案 1 :(得分:7)

无法清除屏幕,但是,伪造它的一种非常简单的方法是打印尽可能多的Serial.println();,以便将所有旧数据保留在屏幕之外。

答案 2 :(得分:5)

我发现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
    }

答案 3 :(得分:3)

你可以尝试:

Serial.write(13);

哪一个会提供一个回车,每次迭代都会返回到行的开头 - 哪个应该做你正在追逐的东西? (特别是如果一切都是固定的宽度)。

答案 4 :(得分:2)

找到一种解决此问题的简单方法。只需将终端窗口的大小调整为仅1行高,就会更容易阅读!

答案 5 :(得分:1)

我能想到的最佳方式是使用processing网上有一些介绍,例如displaying serial dataarduino grapharduino radar
因为Arduino是基于处理它不那么难学的

答案 6 :(得分:1)

ESC是字符_ 2 _7,而不是_ 1 _7。你也可以尝试十进制12(又名.FF,换页)。

请注意,所有这些特殊字符不是由Arduino处理,而是由接收方的程序处理。因此,标准的Unix终端(xterm,gnome-terminal,kterm,...)处理一组不同的控制序列,然后说像HTerm这样的Windows终端程序。

因此,您应该指定您正在使用的程序以进行显示。之后,可以告诉您哪些控制字符和控制序列可用。

答案 7 :(得分:1)

无法根据传入的串行数据清除串行监视器窗口。

我可以想到几个选项,最简单(也是最简单的)是使用println()和你生成的包含传感器数据的固定宽度字符串。

Arduino IDE的串行监视器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 =传感器ID,0.5 =传感器值。然后外部程序将保留这些值(每个传感器1个)。然后外部程序可以以你想要的任何方式显示这些信息,一个漂亮的控制台输出相对容易实现: - )

C#.NETserialport课程,很高兴使用。 (大多数时候!)

Python有一个名为pyserial的模块,这个模块也很简单。

如果您选择以这种方式继续,这两种语言都可以让您更好地控制控制台输出。

答案 8 :(得分:1)

如果您来回更改波特率,则会清除Arduino IDE 1.5.3版中用于Intel Galileo开发的串行监视器窗口

答案 9 :(得分:1)

罐头的另一个踢:

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

答案 10 :(得分:0)

你可以这样做:

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

答案 11 :(得分:0)

我做了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);
    }
}

default terminal

对我有用

答案 12 :(得分:0)

确定要在世界各地确定自己的身份,因为在变通权方面,你可以从《宪法》中获得权利

按行打印所有数据,因此您可以在行中包含所需的数据,我只是解决了相同的问题,只是使您在数据大小和间距之间保持恒定,我做到了

copy on write

答案 13 :(得分:0)

如果你们中的某人在proteus中使用虚拟终端并想清除它,只需添加Serial.write(0x0C); 它将正常工作

答案 14 :(得分:-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);  

  }