我正在为我的机器人从9个不同的传感器读取数据,我需要在同一个窗口中稳定地显示它们,这样我就可以比较这些值并查看是否有任何读数。
我在Serial.print和lcd.print上遇到的问题是值不断移动,在移动机器人时我无法真正看到它们。
我想在显示其他内容之前调用类似Serial.clear()之类的东西,这样可以保持稳定并在一个地方只更改值。
从我到目前为止发现的,不再支持Serial.print(17,BYTE)(调用ESC键)。
所以......对于那些有更多Arduino经验的人来说......这样做的正确方法是什么?
答案 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
答案 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 data,arduino graph和arduino 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#
有.NET
个serialport
课程,很高兴使用。 (大多数时候!)
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);
}