Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/165.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何让Arduino的串行监视器显示一个字符串和一个值,但只有值在变化?_C++_Arduino - Fatal编程技术网

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中工作?