0

这是我的代码:

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 保持不亮...

我在这里做错了什么?

4

3 回答 3

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.

希望能帮助到你!

于 2013-10-13T08:33:33.030 回答
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 类通常很慢。

于 2013-10-13T15:25:55.077 回答
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"));
        }
    }
}
于 2013-10-13T10:13:48.457 回答