首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串比较会产生不好的结果

字符串比较会产生不好的结果
EN

Stack Overflow用户
提问于 2020-08-17 02:21:07
回答 2查看 37关注 0票数 0

我阅读我的串行和打印,以确保条目是正确的。当"red""green""blue" (键入没有引号)时,所有的比较都不起作用。印刷线显示正确的颜色。硬件所有检查与最后一个else闪烁的颜色正确。

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

我替换了String x="red",然后替换了if (x.equals("red")),它就像预期的那样工作。我知道问题在于对myColor的串行读取。我只是想不出怎么让它起作用。

代码:

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-17 02:27:57

将检查代码更改为如下所示:

代码语言:javascript
复制
String x = String("[") + myColor + String("]");
Serial.println(x);
Serial.println(myColor.length());

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

代码语言:javascript
复制
[red ]
[ red]
[red
]

而不是单行[red]。第二个println也输出用于验证的长度,以确保red匹配3blue匹配4,等等。

最后两件事:

  • 我倾向于先关闭当前的输出,然后再打开相关的输出。它可能不是必要的,但它来自于不喜欢同时打开多个输出的系统。这意味着,对于蓝色,您将执行如下操作,其中其他两个首先被驱动到较低的位置,然后蓝色被驱动到较高的位置:

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

  • 您的red代码块当前与blue相同,您可能应该使用以下内容:

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

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

代码语言:javascript
复制
void offOffOn(int offA, int offB, int on) {
    digitalWrite(offA, LOW);
    digitalWrite(offB, LOW);
    digitalWrite(on,   HIGH);
}

然后,您的loop()部分变得更短(还有一个“压缩”else子句):

代码语言:javascript
复制
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);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-08-17 20:05:26

readString是一个可怕的函数,不应该使用。

它使代码运行缓慢(响应速度慢),并按时间分隔消息。

默认情况下,在返回之前,它等待1秒才能到达任何数据。在此之后,它将返回发送的所有内容。

如果您一个接一个地发送"red""green",则myColor将是"red\ngreen\n",除非您在间隔超过1秒的情况下慢慢来。

即使你收到一条单行,在结尾仍然会有一个新的行字符。

你应该使用readStringUntil

代码语言:javascript
复制
myColor = Serial.readStringUntil('\n');

它将使您的代码响应性更强,并返回没有新行字符的行。

只需确保串行监视器只发送一个新行字符("Newline“选项)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63443757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档