/ / Arduino सीरियल झूठे डेटा प्राप्त करता है - ब्लूटूथ, arduino, सीरियल-पोर्ट, arduino-uno

Arduino सीरियल झूठी डेटा प्राप्त करता है - ब्लूटूथ, arduino, धारावाहिक बंदरगाह, arduino-uno

मैं एक परियोजना पर काम कर रहा हूं जिसमें मैं एक फोन का उपयोग करता हूंऐप जिसे मैंने Google के वाक् पहचानकर्ता का उपयोग करने के लिए बनाया था, अपने फोन को ब्लूटूथ के माध्यम से अपने Arduino के साथ कनेक्ट करें और फिर जब मैं एक शब्द कहता हूं तो यह शब्द को एलसीडी में प्रदर्शित करने के लिए भेजता है।

फोन ऐप बिना किसी समस्या के शानदार काम करता है। समस्या Arduino कोड में है। जब मैं शब्द कहता हूं नमस्ते उदाहरण के लिए Arduino प्राप्त करता है एलो। मुझे पता है कि यह इसे प्राप्त करता है क्योंकि मैं भी उपयोग करता हूंएलसीडी को छोड़कर मेरे कंप्यूटर स्क्रीन में डेटा प्रदर्शित करने के लिए सीरियल मॉनिटर। अगर मैं दूसरा शब्द भेजता हूं, तो उसके बाद Arduino डेटा का पहला हिस्सा प्राप्त करता है विश्व Arduino प्राप्त करता है elloorld। इसलिए यह न केवल शब्द के पहले अक्षर को याद करता है, बल्कि लूप के अंत में सीरियल पोर्ट भी इसे खाली नहीं करता है।

मैंने कोशिश की data += c; के बजाय data.concat(c); और अंतर यह है कि दूसरा शब्द isn "t 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 doesn "टी सभी डेटा प्राप्त करते हैं।

उत्तर:

उत्तर № 1 के लिए 1

आपका कोड हर 3000 ms पर उठता है, फिर सब कुछ जो कि सीरियल इनपुट बफर में लंबित है और फिर से सो जाता है।

यदि आप उस बदसूरत स्ट्रिंग डेटा और बदसूरत देरी (3000) और अनावश्यक को हटाते हैं, तो आप इस सरल लूप को आजमा सकते हैं:

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