/ / Arduino Serial recebe dados falsos - bluetooth, arduino, porta serial, arduino-uno

Arduino Serial recebe dados falsos - bluetooth, arduino, porta serial, arduino-uno

Estou trabalhando em um projeto no qual uso um telefoneaplicativo que eu criei para usar o Speech Recognizer do Google, conecte meu telefone ao meu Arduino via Bluetooth e, quando digo uma palavra, ela envia a palavra para exibi-la em um LCD.

O aplicativo do telefone funciona muito bem, sem problemas. O problema está no código do Arduino. Quando eu digo a palavra Olá por exemplo, o Arduino recebe ello. Eu sei que ele recebe porque eu também usoo monitor Serial para exibir os dados na tela do meu computador, exceto o LCD. Depois que o Arduino receber o primeiro pedaço de dados, se eu enviar uma segunda palavra como mundo Arduino recebe elloorld. Portanto, não apenas perde novamente a primeira letra da palavra, mas também a porta serial não a esvazia no final do loop.

Eu tentei com data += c; ao invés de data.concat(c); e a diferença é que a segunda palavra não é "t elloorld e é apenas orld

Aqui está o meu código:

#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 = "";
}

Se no final do loop eu tentar limpar a porta serial com este código:

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

Então o arduino não recebe dados.

Respostas:

1 para resposta № 1

Seu código é ativado a cada 3000 ms, depois processa tudo o que está pendente no buffer de entrada serial e adormece novamente.

Se você remover os dados feios da String, o atraso feio (3000) e o tempo desnecessário, tente este loop simples:

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
}
}