Arduino没有';无法正确解析文本

Arduino没有';无法正确解析文本,arduino,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.r

这是我的密码:

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;
}
const int RED=11;
常数int GRN=10;
常数int BLU=9;
字符串inputString=“”;
布尔stringComplete=false;
无效设置(){
Serial.begin(9600);
pinMode(红色,输出);
pinMode(GRN,输出);
pinMode(蓝光,输出);
inputString.reserve(256);
//我用的是一个普通的阳极发光二极管,
//因此,高和低是相反的
数字写入(红色,高);
数字写入(GRN,高);
数字写入(蓝色,高);
}
void循环(){
如果(完成){
inputString.toLowerCase();
Serial.println(“已接收”+输入字符串);
匹配字符串(inputString,500);
inputString=“”;
stringComplete=false;
}
}
void serialEvent(){
while(Serial.available()){
char inChar=(char)Serial.read();
输入字符串+=英寸;
如果(英寸=='\n')
stringComplete=true;
}
}
无效匹配字符串(字符串输入,整数持续时间){
if(包含字符串(输入,“红色”)){
颜色(红色,持续时间);
Serial.write(“输入匹配的红色\n”);//添加用于调试
}
else if(包含字符串(输入,“绿色”)){
颜色(GRN,持续时间);
串行写入(“输入匹配绿色\n”);
}
else if(包含字符串(输入,“蓝色”)){
颜色(蓝色,持续时间);
串行写入(“输入匹配的蓝色\n”);
}
否则{
延迟(持续时间);
Serial.write(“输入与任何内容都不匹配\n”);
}
}
无效颜色(内部引脚、内部持续时间){
数字写入(引脚,低电平);
延迟(持续时间);
数字写入(引脚,高);
}
//为以后的实现添加了
无效颜色(int-pin1、int-pin2、int-duration){
数字写入(引脚1,低电平);
数字写入(pin2,低电平);
延迟(持续时间);
数字写入(引脚1,高电平);
数字写入(pin2,高电平);
}
//尝试实现String.contains
布尔containssString(字符串输入,字符串搜索){
int max=input.length()-search.length();

对于(int i=0;i查找特定字符串“红色”、“蓝色”和“绿色”,应使用
indexOf('String To look')
)。 如果找到,它将返回字符串的索引;如果找不到,它将返回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.
}
或者将其添加到
containssString
的实现中


希望有帮助!

根据您的代码,您正在搜索“\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"));
        }
    }
}

我在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;
}
对于那些不熟悉C/C++函数strstrstr的人来说,它的基本功能是返回我要查找的字符串的位置,如果没有找到任何内容,则返回NULL,唯一的缺点是它要求我使用C字符串,因此使用
.C_str()


据说使用C函数比使用内置函数更快,因为在Arduino中使用String类通常比使用char数组慢。

这是一个很好的解决方法。我不熟悉
strstr
,但是如果你说它像一个符咒一样工作,而且速度更快,我会马上使用它!它很有效它与indexOf相同,只是它使用char数组,如果找不到任何内容,则返回null而不是0,因此我想这两种解决方案同样有效
boolean containsString(String input, String search) {
  return (strstr(input.c_str(), search.c_str()) != NULL);
}