2016-08-05 45 views
0

Ich arbeite an einem Projekt, in dem ich eine Telefon-App verwende, die ich gebaut habe, um Googles Speech Recognizer zu verwenden, mein Telefon mit meinem Arduino über Bluetooth zu verbinden und dann, wenn ich ein Wort sage Wort, um es in einem LCD anzuzeigen.Arduino Serial empfängt falsche Daten

Die Telefon-App funktioniert gut, ohne Probleme. Das Problem liegt im Arduino-Code. Wenn ich sage das Wort hallo zum Beispiel der Arduino erhält ello. Ich weiß, dass es empfangen wird, weil ich auch den seriellen Monitor verwende, um die Daten auf meinem Computerbildschirm außer dem LCD anzuzeigen. Dann, nachdem Arduino den ersten Teil der Daten empfängt, wenn ich ein zweites Wort wie Welt Arduino senden empfängt elloorld. Es fehlt also nicht nur der erste Buchstabe des Wortes, sondern auch der serielle Port ist am Ende der Schleife nicht leer.

Ich habe versucht, mit data += c; statt data.concat(c); und der Unterschied ist, dass das zweite Wort nicht elloorld ist, und es ist nur elt

Hier ist mein Code:

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

Wenn ich am Ende der Schleife versuche, die serielle Schnittstelle mit diesem Code zu reinigen:

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

Dann empfängt das Arduino überhaupt keine Daten.

+0

Was ist, wenn Sie, dass Android SpeechToText zu Bluetooth Kniff entfernen und testen Sie es mit SerialMonitor? – datafiddler

+0

Es ist für 3 Sekunden tot, bis Sie Daten löschen und von vorne beginnen. Ist das okay für dich? Gibt es einen Grund dafür? – datafiddler

+0

Wenn ich das Bluetooth-Modul abziehe und den seriellen Monitor benutze, wird das ganze Wort angezeigt, aber am Ende wird 2 ΞΞ hinzugefügt. d. h. Hallo. – vamoirid

Antwort

1

Ihr Code wacht alle 3000 ms auf, verarbeitet dann alle ausstehenden Daten im seriellen Eingabepuffer und schläft wieder ein.

Wenn Sie feststellen, dass hässliche String-Daten und die hässliche Verzögerung (3000) und die unnötige während entfernen, können Sie diese einfache Schleife versuchen:

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

steuern Dies funktioniert jetzt perfekt! Danke für die Information! Ich werde versuchen, die millis() -Funktion mehr zu verwenden und die Verzögerung zu vermeiden, weil ich jetzt verstehe, wie schlecht es für das Programm ist. – vamoirid