C++ 如何让Arduino的串行监视器显示一个字符串和一个值,但只有值在变化?
我已经有了我的代码,我只是想让它看起来更好。就我的设备做一个简短的总结:智能停车系统可以检测进出停车场的车辆,并显示入口有多少空位可用或没有空位。现在,输出如下所示:C++ 如何让Arduino的串行监视器显示一个字符串和一个值,但只有值在变化?,c++,arduino,C++,Arduino,我已经有了我的代码,我只是想让它看起来更好。就我的设备做一个简短的总结:智能停车系统可以检测进出停车场的车辆,并显示入口有多少空位可用或没有空位。现在,输出如下所示: Vacant Spots: 1 Vacant Spots: 1 Vacant Spots: 1 Vacant Spots: 1 Vacant Spots: 0 . . . . . 这是在一辆车进入的情况下,它会减少1,当一辆车离开时,它会增加,因为有一个额外的空位可用。我想做的是让输出像这样: Vacant Spots: 1 V
Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 0
.
.
.
.
.
这是在一辆车进入的情况下,它会减少1,当一辆车离开时,它会增加,因为有一个额外的空位可用。我想做的是让输出像这样:
Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 1
Vacant Spots: 0
.
.
.
.
.
"
空缺名额:1
"
我唯一想改变的是数值。我不想要源源不断的工作
“空位:1”显示在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);
}
}
}
}
int readValue=0;
无效设置()
{
Serial.begin(9600);
}
int-vslots=1;
void循环()
{
如果(Serial.available()>21)
{
if(Serial.read()==0x7E)
{
对于(int i=0;i首先,您需要了解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);
要了解更多信息和方法,你可以查看这篇文章。但是已经尝试了所有方法,并建议使用putty。在println
中的ln
后缀代表新行。这意味着println
将“打印”值和新行
因此,作为初始解决方案,您可以从使用println
更改为普通print
:
Serial.print("Vacant Spots: ");
Serial.print(vslots); // Note: not println
然后,我们必须解决返回到行首的问题。要覆盖旧文本,通常使用carrate-返回字符'\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);
想一想函数中的ln
后缀意味着什么。还要想一想字符'\r'
可能会做什么。谢谢!我知道你说过要使用putty,但我能在Arduino中测试这段代码只是为了测试,还是这段代码只能在putty中工作?