18

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

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

我正在考虑在显示其他任何内容之前调用类似 Serial.clear() 的东西,这只会让事情保持稳定并在一个地方,只改变值。

从我目前发现的情况来看,例如 Serial.print(17,BYTE) 不再受支持(调用 ESC 键)。

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

4

14 回答 14

40

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-Wireless-Controlled-Arduino-Powered-Message-B/step6/Useful-Code-Explained-Clearing-a-Serial-Terminal/

于 2013-03-21T22:20:50.620 回答
8

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

于 2012-04-14T02:14:06.837 回答
6

我发现 ASCII 12 制作了一个Form feed,这是一个新页面。这是维基百科的定义

“换页是一个分页的 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
    }
于 2016-01-19T19:28:38.873 回答
3

你可以试试:

Serial.write(13);

哪个将提供一个回车,每次迭代都返回到行首 - 这应该做你所追求的?(特别是如果一切都是固定宽度)。

于 2012-12-08T04:05:04.847 回答
1

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

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

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

于 2012-04-11T16:32:15.983 回答
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#has.NETserialport类,使用起来很愉快。(大多数时候!)

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

如果您选择以这种方式进行,任何一种语言都可以让您更好地控制控制台输出。

于 2012-04-11T16:34:17.950 回答
1

我能想到的最好的方法是使用处理,网上有一些介绍,比如显示串行数据arduino 图arduino 雷达
, 因为 Arduino 是基于处理的,所以学习起来并不难

于 2012-04-11T14:20:15.017 回答
1

例如,如果您来回更改波特率,它将清除用于英特尔 Galileo 开发的 Arduino IDE 1.5.3 版中的串行监视器窗口

于 2014-04-03T09:39:58.913 回答
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(){}
于 2016-06-13T05:43:25.930 回答
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");
}
于 2016-07-28T09:59:36.383 回答
0

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

打印所有数据行,所以你有你需要的数据行,我只是解决了同样的问题,只是让你有一个恒定的数据大小和间距,我做了这个

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);
于 2018-11-19T20:49:44.660 回答
0

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

于 2019-06-14T11:15:18.183 回答
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\n");
    }
}

它适用于我default terminal

于 2017-01-12T05:23:36.797 回答
-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);  

  }
于 2014-12-09T20:10:08.103 回答