2013-10-12 52 views
0

這裏是我的代碼:Arduino的不解析文本正確

const int RED = 11; 
const int GRN = 10; 
const int BLU = 9; 

String inputString = ""; 
boolean stringComplete = false; 

void setup() { 
    Serial.begin(9600); 
    pinMode(RED, OUTPUT); 
    pinMode(GRN, OUTPUT); 
    pinMode(BLU, OUTPUT); 
    inputString.reserve(256); 

    // I'm using a common-anode led, 
    //so HIGH and LOW works in reverse 
    digitalWrite(RED, HIGH); 
    digitalWrite(GRN, HIGH); 
    digitalWrite(BLU, HIGH); 
} 

void loop() { 
    if(stringComplete) { 
    inputString.toLowerCase(); 
    Serial.println("received " + inputString); 

    matchString(inputString, 500); 

    inputString = ""; 
    stringComplete = false; 
    } 
} 

void serialEvent() { 
    while(Serial.available()) { 
    char inChar = (char) Serial.read(); 
    inputString += inChar; 
    if(inChar == '\n') 
     stringComplete = true; 
    } 
} 

void matchString(String input, int duration) { 
    if(containsString(input,"red")) { 
    colour(RED, duration); 
    Serial.write("input matched red\n"); // added for debugging 
    } 
    else if(containsString(input, "green")) { 
    colour(GRN, duration); 
    Serial.write("input matched green\n"); 
    } 
    else if(containsString(input, "blue")) { 
    colour(BLU, duration); 
    Serial.write("input matched blue\n"); 
    } 
    else { 
    delay(duration); 
    Serial.write("input didn't match anything\n"); 
    } 
} 

void colour(int pin, int duration) { 
    digitalWrite(pin, LOW); 
    delay(duration); 
    digitalWrite(pin, HIGH); 
} 

// added for later implementation 
void colour(int pin1, int pin2, int duration) { 
    digitalWrite(pin1, LOW); 
    digitalWrite(pin2, LOW); 
    delay(duration); 
    digitalWrite(pin1, HIGH); 
    digitalWrite(pin2, HIGH); 
} 

// attempt to implement String.contains 
boolean containsString(String input, String search) { 
    int max = input.length() - search.length(); 

    for(int i = 0; i <= max; i++) { 
    if(input.substring(i) == search) 
     return true; 
    } 
    return false; 
} 

我不知道哪裏出了問題在這裏,我知道它讀取字符流,但它總是寫input didn't match anything回到我的身邊,保持該LED熄滅......

我做了什麼錯在這裏?

回答

1

我問的Arduino的論壇同樣的問題,他們爲我提供了一個非常簡單的(但不是很明顯)解決方法

因此而不是做這一切:

boolean containsString(String input, String search) { 
    int max = input.length() - search.length(); 

    for(int i = 0; i <= max; i++) { 
    if(input.substring(i) == search) 
     return true; 
    } 
    return false; 
} 

反正不起作用

我所要做的就是這樣:

boolean containsString(String input, String search) { 
    return (strstr(input.c_str(), search.c_str()) != NULL); 
} 

對於那些不熟悉C/C++函數strstr,基本上它的作用是返回我要找的字符串,或NULL的位置,如果沒有找到任何東西,唯一的缺點是它因此需要使用C字符串,因此.c_str()

據稱,使用C函數比內置函數更快,因爲與使用char數組相比,使用Arduino中的String類通常速度較慢。

+0

這是一個不錯的解決方法。我對'strstr'不熟悉,但如果你說它像魅力一樣工作,速度更快,我就馬上使用它! – ladislas

+0

它的工作原理相同,您的indexOf,除了使用字符數組,並返回null而不是0,如果沒有找到任何東西,所以這兩個方案都同樣有效。我猜 –

1

要查找特定的字符串「紅」,「藍」和「綠色」,你應該使用indexOf('String to look for')。 它將返回字符串的索引,如果找不到,則返回0。

因此,基本上,你可以這樣做:

void matchString(String input, int duration) { 
    if (input.indexOf("red") > 0) { 
     colour(RED, duration); 
     Serial.println("input matched red\n"); // added for debugging 
    } 

    //rest of the if/else statement based on the first one. 
} 

或將其添加到您的實現的containsString

希望它有幫助!

0

根據你的代碼,你正在尋找「\ n」作爲行終止。你確定你確實發送了換行符嗎? Arduino串行監視器沒有。我的建議是迴應換行符,以確定是否真的發送並檢測它們。

void serialEvent() { 
    while(Serial.available()) { 
     char inChar = (char) Serial.read(); 
     inputString += inChar; 
     if(inChar == '\n') { 
      stringComplete = true; 
      Serial.print(F("line terminator detected")); 
     } 
    } 
}