Arduino无法正确解析文本

时间:2013-10-12 16:04:39

标签: 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不亮......

我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

要查找特定字符串“red”,“blue”和“green”,您应该使用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的实现中。

希望它有所帮助!

答案 1 :(得分: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类通常很慢。

答案 2 :(得分: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"));
        }
    }
}