这是我的代码:
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不亮......
我在这里做错了什么?
答案 0 :(得分:1)
要查找特定字符串“red”,“blue”和“green”,您应该使用indexOf('String to look for')
。
如果找到则返回字符串的索引,如果没有找到则返回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.
}
或者将其添加到containsString
的实现中。
希望它有所帮助!
答案 1 :(得分: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()
据称,使用C函数比使用内置函数更快,因为与使用char数组相比,使用Arduino中的String类通常很慢。
答案 2 :(得分: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"));
}
}
}