string - 字符串比较产生不好的结果
问题描述
我从我的序列中阅读并打印以确保条目正确。当"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);
}
}
}
解决方案
将您的检查代码更改为:
String x = String("[") + myColor + String("]");
Serial.println(x);
Serial.println(myColor.length());
您的字符串很有可能包含其他内容,例如换行符或空格。如果是这样,您将看到如下输出:
[red ]
[ red]
[red
]
而不是单行[red]
。二println
是也输出长度进行校验,保证red
matches 3
、blue
matches4
等。
最后两件事:
在打开相关输出之前,我倾向于先关闭电流输出。这可能不是必需的,但它来自于被不喜欢同时打开多个输出的系统所烧毁。这意味着,对于蓝色,您将执行以下操作,其中其他两个首先被驱动为低电平,然后蓝色被驱动为高电平:
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);
}
}
推荐阅读
- kubernetes - Kubernetes 浪费资源
- api - npm request - 用于 twitch 数据的自定义 HTTP 标头
- spring - 获取 java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder 更新 Spring Cloud 版本到 Brixton.SR6 后
- javascript - ReactJS - 如何将字符串中的html元素列表作为html元素返回
- elasticsearch - 将多类型索引迁移到单类型索引
- node-red - 无法使用 Switch 节点可视化我的数据
- android - Android - Kotlin:在扩展应用程序的类中实例化一个对象并在所有活动中使用它
- javascript - vue组件上的js函数
- javascript - SAPUI5 表在获取选定行数据时出现多选错误
- sql - 是否有可能将单元格数据拆分为 Oracle 中的多个列