首页 > 解决方案 > 字符串比较产生不好的结果

问题描述

我从我的序列中阅读并打印以确保条目正确。当"red" "green""blue"(不带引号键入)时,所有比较都不起作用。打印线显示正确的颜色。硬件所有检查与最后一次else正确闪烁的颜色。

我试过了if (myColor == "red")if (myColor.equals("red")但没有一种颜色有效。

我替换了String x="red"然后if (x.equals("red")),它按预期工作。我知道问题出在串行读取到myColor. 我只是不知道如何使它工作。

代码:

int redPin=8;
int greenPin=9;
int bluePin=10;

String myColor;
String msg="What color do you want? ";

void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    pinMode(redPin, OUTPUT);
    pinMode(bluePin, OUTPUT);
    pinMode(greenPin, OUTPUT);
}

void loop() {
    Serial.println(msg);

    while (Serial.available()==0){
    }

    myColor=Serial.readString();
    Serial.println(myColor); //check to see that it was entered correctly

    if (myColor == "red"){
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, HIGH);
        digitalWrite(greenPin, LOW);
    }
    else if (myColor == "green"){
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, LOW);
        digitalWrite(greenPin, HIGH);
    }
    else if (myColor == "blue"){
        digitalWrite(redPin, LOW);
        digitalWrite(bluePin, HIGH);
        digitalWrite(greenPin, LOW);
    }
    else {
        for (int x = 0; x < 3; x++){
            digitalWrite(redPin, HIGH);
            delay (500);
            digitalWrite(redPin, LOW);
            delay (500);
            digitalWrite(bluePin, HIGH);
            delay (500);
            digitalWrite(bluePin, LOW);
            delay (500);
            digitalWrite(greenPin, HIGH);
            delay (500);
            digitalWrite(greenPin, LOW);
            delay(500);
        }
    }
}

标签: stringarduinoserial-portcomparison

解决方案


将您的检查代码更改为:

String x = String("[") + myColor + String("]");
Serial.println(x);
Serial.println(myColor.length());

您的字符串很有可能包含其他内容,例如换行符或空格。如果是这样,您将看到如下输出:

[red ]
[ red]
[red
]

而不是单行[red]。二println是也输出长度进行校验,保证redmatches 3bluematches4等。


最后两件事:

  • 在打开相关输出之前,我倾向于先关闭电流输出。这可能不是必需的,但它来自于被不喜欢同时打开多个输出的系统所烧毁。这意味着,对于蓝色,您将执行以下操作,其中其他两个首先被驱动为低电平,然后蓝色被驱动为高电平:

    digitalWrite(redPin,   LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin,  HIGH);
    
  • 您的代码块red当前与 相同blue,您可能应该使用以下代码:

    digitalWrite(bluePin,  LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(redPin,   HIGH);
    

在上面的第一个要点上,您可以通过一些重构来简化代码,例如引入一个函数来选择哪个引脚处于打开状态:

void offOffOn(int offA, int offB, int on) {
    digitalWrite(offA, LOW);
    digitalWrite(offB, LOW);
    digitalWrite(on,   HIGH);
}

然后您的loop()部分变得更短(也带有“压缩”else子句):

if (myColor == "red") {
    offOffOn(greenPin, bluePin, redPin);
} else if (myColor == "green") {
    offOffOn(redPin, bluePin, greenPin);
} else if (myColor == "blue") {
    offOffOn(redPin, greenPin, bluePin);
} else {
    int allPins[] = { redPin, bluePin, greenPin };
    size_t pinCount = sizeof(allPins) / sizeof(*allPins);
    for (int count = 0; count < pinCount * 3; ++count) {
        digitalWrite(allPins[idx % pinCount], HIGH); delay (500);
        digitalWrite(allPins[idx % pinCount], LOW);  delay (500);
    }
}

推荐阅读