【问题标题】:Arduino Serial receives false dataArduino Serial 接收到虚假数据
【发布时间】:2016-08-05 20:49:04
【问题描述】:

我正在做一个项目,我使用我构建的手机应用程序来使用谷歌的语音识别器,通过蓝牙将我的手机与我的 Arduino 连接,然后当我说一个词时,它会发送这个词以显示它在 LCD 中。

手机应用程序运行良好,没有任何问题。问题出在 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根本不接收数据。

【问题讨论】:

  • 如果你把那个 android SpeechToText 移除到蓝牙噱头并用 SerialMonitor 测试它会怎样?
  • 它会死掉 3 秒,直到您清除数据并重新开始。这个可以吗?这是有原因的吗?
  • 如果我断开蓝牙模块并使用串行监视器,它会显示整个单词,但最后会添加 2 ΞΞ 。即你好ΞΞ。
  • 延迟功能只是在 3 秒内看到 lcd 中的单词。我应该用标志来代替,以免使用延迟吗?
  • helloΞΞ 可能显示了 SerialMonitor 添加的 CR / LF - 您可以在 SerialMonitor 中控制它

标签: bluetooth arduino serial-port arduino-uno


【解决方案1】:

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

如果你删除那些丑陋的字符串数据和丑陋的延迟(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
  }
}

【讨论】:

  • 现在完美运行!谢谢(你的)信息!我会尝试更多地使用 millis() 函数并避免延迟,因为现在我明白它对程序有多么糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
相关资源
最近更新 更多