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

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()

また、Arduino での String クラスの操作は、char 配列の操作に比べて一般的に遅いため、組み込み関数よりも C 関数を使用する方が速いと言われています。

于 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 に答える