如何让Arduino的串行监视器向字符串显示值,但只有值在更改



我已经有代码要工作了,我现在只是想让它看起来更好。只是简单总结一下我的设备的功能:智能停车系统,它可以检测进出停车场的汽车,并显示入口处有多少空位。现在的输出是这样的:

Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 0
.
.
.
.
.

这是在汽车进入时的情况,因此它递减1,当汽车离开时它递增,因为有一个额外的空位可用。我想做的是让输出看起来像这样:

"空缺职位:1名

">

我唯一想改变的是数值。我不想要源源不断的"空位:1〃;s显示在LCD显示屏上,供停车用户查看。有没有一种方法可以在循环结束后清除串行监视器,而不让它连续输出低于它的新值?我已经提供了程序的代码。我有3个xbee(1个协调器和2个路由器(。这两个路由器上没有代码,只是向协调器发送数据。协调器是它接收数据的地方。这是协调员的代码:

int readValue = 0;
void setup()
{
Serial.begin(9600);
}
int vslots = 1;
void loop()
{
if(Serial.available()>21)
{
if(Serial.read() == 0x7E)
{
for(int i=0;i<19;i++)
{
byte discard = Serial.read(); //Next 18 bytes, it's discarded
}
readValue = Serial.read();
bool flagTrue = false;
bool flagFalse = false;

if((readValue == 0) && flagTrue == false ) //EXIT
{    
flagTrue = true;
flagFalse = false;
Serial.print("Vacant Spots: ");
Serial.println(vslots);    
}
else if((readValue == 16 && flagFalse == false) && vslots >= 1)
//DECREMENT (CAR ENTERING)    
{
flagTrue = false;
flagFalse = true;
vslots -= 1;
Serial.print("Vacant Spots: ");
Serial.println(vslots);
}

if((readValue == 18) && flagTrue == false )
{    
flagTrue = true;
flagFalse = false;
Serial.print("Vacant Spots: ");
Serial.println(vslots);    
}
else if((readValue == 19 && flagFalse == false) && vslots <= 10)
//INCREMENT (CAR EXITING)    
{
flagTrue = false;
flagFalse = true;
vslots += 1;
Serial.print("Vacant Spots: ");
Serial.println(vslots);
}


}  
}
}

首先,您需要了解Arduino串行终端不像真正的终端软件。它不支持在UART上发送命令。因此,要实现您想要的目标,您需要真正的终端软件,如putty。它允许您通过使用UART通信发送字符字节来进行更改。

//ADD these lines before printing on a serial terminal
Serial.write(27);       // 27 is an ESC command for terminal
Serial.print("[2J");    // this will clear screen
Serial.write(27);       // 27 is an ESC command for terminal
Serial.print("[H");     // move cursor to home 
//now print what you want...
Serial.print("Vacant Spots: ");
Serial.println(vslots);

有关更多信息和方法,你可以在这里查看这篇文章。但他已经尝试了所有的方法,并建议使用油灰。

println中的ln后缀代表新行。这意味着CCD_ 3将";打印";值为换行符。

因此,作为初始解决方案,您可以从使用println更改为使用普通print:

Serial.print("Vacant Spots: ");
Serial.print(vslots);  // Note: not println

然后我们必须解决返回到行的开头的问题。以覆盖旧文本。这通常使用腐肉-返回字符'r'来完成。如果我们将其添加到打印输出的开头:

Serial.print("rVacant Spots: ");  // Note initial cariage-return
Serial.print(vslots);  // Note: not println

然后,每个打印输出都应该返回到该行的开头,并覆盖该行上以前的内容。

为了确保每一行的长度相等,您可以使用例如sprintf来首先格式化字符串,然后将其写入串行端口:

char buffer[32];
// - for left justification,
// 5 for width of value (padded with spaces)
sprintf(buffer, "rVacant Spots: %-5d", vslots);
Serial.print(buffer);

最新更新