这段代码有什么问题?串行监视器正在显示垃圾值

时间:2018-04-05 08:22:49

标签: bluetooth arduino-uno

arduino正在使用HC-05与Android设备通信。使用串行蓝牙终端应用程序发送数据。

SoftwareSerial BT(10, 11); //TX, RX respetively
String readdata;
char c = "" ;
void setup() {
   BT.begin(9600);
   Serial.begin(9600);
   Serial.println("Waiting for command...");
}
//-----------------------------------------------------------------------//
void loop() {
   if (BT.available() > 0) { //Check if there is an available byte to read
      delay(10); //Delay added to make thing stable
      c = BT.read(); //Conduct a serial read
      readdata.concat(c); //build the string- "forward", "reverse", "left" and "right"
      Serial.println(readdata);
   }
   if (readdata.length() > 0) {
      if (readdata == "Up")
      {
         Serial.println("Hello there");
      }
      readdata = "";
   }
}

[Serial Monitor][1]
It shows a random character for any input

  [1]: https://i.stack.imgur.com/nhTh5.png

1 个答案:

答案 0 :(得分:0)

首先,您需要检查所看到的垃圾的模式。如果您无论输入如何随机查看字符,那么您应该检查物理连接和应该提供输入数据的蓝牙对应SW。然后,如果您在输出中看到输入的顺序,那么您  在行readdata = "";中创建了问题。在上面的if语句中,只调用了一次read()函数,您永远不能保证在第二个if语句中获取整个命令字符串。此外,缓冲区重置为空。

如果你想简单地解决这个问题,除非Arduino和其他设备之间的连接和接口有任何问题(我不知道),然后用if更改while语句loop()并将Serial.println(readdata)移出while语句,如下所示。

   while (BT.available() > 0) { //Check if there is an available byte to read
      delay(10); //Delay added to make thing stable
      c = BT.read(); //Conduct a serial read
      readdata.concat(c); //build the string- "forward", "reverse", "left" and "right"
      //Serial.println(readdata);
   }
   Serial.println(readdata);

或者,您也可以使用BT.readline()代替whileBT.read()readdata.concat(c),如下所示。我推荐这个,因为根据我的经验,上述解决方案仍然存在缺陷。

  if (BT.available() > 0) {
      readdata = BT.readline();
  }

我不知道你是否在每个命令结束时期待新线路。然后你最好选择第二个选项。如果你为每个命令使用另一个终结符,那么你应该在第一个选项中的read()函数调用之后发出另一个if语句。