【问题标题】:How do I have the serial monitor of the Arduino show a string a value but only the value is changing?如何让 Arduino 的串行监视器显示一个字符串值,但只有值在变化?
【发布时间】:2020-11-20 15:01:46
【问题描述】:

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

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

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

" 空缺名额:1

"

我唯一想改变的是数值。我不想要源源不断的 “空位:1”显示在液晶显示屏上,供停车用户查看。有没有办法在循环结束后清除串行监视器而不让它连续输出低于它的新值?我已经提供了该程序的代码。我有 3 个 xbees(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);
               }
           


         }  
   }
}

【问题讨论】:

  • 想想println函数中的ln后缀是什么意思。还要考虑carriage-return 字符'\r' 可能会做什么。

标签: c++ arduino


【解决方案1】:

首先,您需要了解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);

有关更多信息和方法,您可以查看此帖子here。但是已经尝试了一切并建议使用腻子。

【讨论】:

  • 谢谢!我知道你说过要使用 putty,但我可以在 Arduino 中测试这段代码只是为了测试还是这段代码只能在 putty 中工作?
【解决方案2】:

println 中的ln 后缀代表换行。这意味着println 将“打印”值换行符。

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

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

然后我们要解决回到行首的问题。覆盖旧文本。这通常使用 carriate-return 字符 '\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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多