Arduino Serial 接收到虚假数据

Arduino Serial receives false data

我正在做一个项目,在这个项目中,我使用了我构建的 phone 应用程序,以便使用 Google 的语音识别器,通过以下方式将我的 phone 与我的 Arduino 连接起来蓝牙,然后当我说一个词时它发送这个词以便在 LCD 上显示它。

phone 应用程序运行良好,没有任何问题。问题出在 Arduino 代码中。例如,当我说 hello 这个词时,Arduino 收到 ello.我知道它收到了它,因为我还使用串行监视器在我的电脑屏幕上显示数据,LCD 除外。然后在 Arduino 收到第一块数据后,如果我发送第二个单词,如 world Arduino 收到 elloorld 。所以它不仅再次错过了单词的第一个字母,而且在循环结束时串口也不为空。

我尝试使用 data += c; 而不是 data.concat(c);,不同之处在于第二个单词不是 elloorld 而它只是 orld

这是我的代码:

#include <LiquidCrystal.h> 

LiquidCrystal lcd(12, 11, 9, 8, 7, 6, 5, 4, 3, 2);

char c;
String data = "";

void setup() {
  lcd.begin(16, 2);

  Serial.begin(9600);
}

void loop() {
  lcd.clear();  //clean the lcd
  lcd.home();   // set the cursor in the up left corner

  while(Serial.available() > 0){
    c = Serial.read();
    data.concat(c);
  }

  if(data.length() > 0){
    Serial.println(data);
  }

  lcd.print(data);

  delay(3000);

  data = "";
}

如果在循环结束时我尝试使用以下代码清理串口:

while(Serial.available() > 0){
  Serial.read();
}

然后arduino根本收不到数据

您的代码每 3000 毫秒唤醒一次,然后处理串行输入缓冲区中待处理的所有内容,然后再次进入休眠状态。

如果删除丑陋的字符串数据和丑陋的 delay(3000) 以及不必要的 while,您可以尝试这个简单的循环:

unsigned long lastreceived;
void loop() {
  if (Serial.available()) {
     lcd.write(Serial.read());
     lastreceived=millis();
  }
  if (millis() - lastreceived > 1000) {
    // after one second of silence, prepare for a new message
    lcd.clear();
    lcd.home();
    lastreceived=millis(); // don't clear too often
  }
}