How to compare string from Serial.read()?
下面是我从这个论坛获得的代码。它对我不起作用,但是他们声称代码很好。我已经尝试了几种字符串比较方法,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | int ledPin = 13; String readString; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); Serial.println("serial on/off test 0021"); // so I can keep track } void loop() { while (Serial.available()) { delay(3); char c = Serial.read(); readString += c; } if (readString.length() >0) { if (readString =="on") { Serial.println("switching on"); digitalWrite(ledPin, HIGH); } if (readString =="off") { digitalWrite(ledPin, LOW); } readString=""; } } |
我可以通过在字符串比较之前简单地添加
我将函数放置在下面的代码中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | int ledPin = 13; String readString; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); Serial.println("serial on/off test 0021"); // so I can keep track } void loop() { while (Serial.available()) { delay(3); char c = Serial.read(); readString += c; } readString.trim(); if (readString.length() >0) { if (readString =="on"){ Serial.println("switching on"); digitalWrite(ledPin, HIGH); } if (readString =="off") { Serial.println("switching off"); digitalWrite(ledPin, LOW); } readString=""; } } |
为什么不使用Serial.readString(); ??
尝试一下..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void setup() { pinMode(13, OUTPUT); Serial.begin(9600); } void loop(){ if(Serial.available()){ String ch; ch = Serial.readString(); ch.trim(); if(ch=="on"||ch=="ON"){ digitalWrite(13, HIGH); } else if(ch=="off"||ch=="OFF"){ digitalWrite(13, LOW); } } } |
我只使用
1 2 3 | char c = Serial.read(); if (c == '1'){ //do something} |
新的SafeString Arduino库(可从库管理器中获得)使此操作变得简单而安全。与Arduino字符串不同,SafeStrings永远不会导致您的草图重启,也不会导致堆碎片化。
请参见https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html
上的详细教程
SafeStrings易于调试。 SafeStrings提供详细的错误消息,包括有问题的SafeString的名称,以帮助您使程序正确运行。
SafeStrings安全可靠。即使您的代码传递了空指针或'\\\\ 0'参数或超过了SafeString的可用容量,SafeString都不会导致重新启动,并且始终处于有效的可用状态。
SafeString程序永远运行。 SafeString完全避免了内存碎片,该碎片最终将导致您的程序失败,并且在作为参数传递时永远不会产生多余的副本。
SafeStrings更快。 SafeString不会创建多个副本或短寿命的对象,也不会进行不必要的数据复制。
SafeString还具有标记化/解析方法。可能详尽的示例之一包括库封面,其中读取用户输入并解析命令,同时使其余草图以最大速度运行。 SafeString方法中没有邪恶的delay()可以阻止草图中的轨迹。
注意:在下面的示例代码中,SafeString的大小很小,但是该代码可以处理来自用户的任意长输入。
用户串行输入,例如
这是打开和关闭等的长时间输入
可以很好地处理和解析。
SafeString还具有广泛的调试和错误消息,以帮助您查找和解决编码问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include"SafeString.h" const size_t maxCmdLength = 3; // make SafeStrings at least large enough to hold longest cmd // Use SafeStrings for the commands as comparing two SafeStrings is generally faster as the lengths can be compared first. createSafeString(onCmdStr, maxCmdLength,"on"); createSafeString(offCmdStr, maxCmdLength,"off"); // input must be large enough to hold longest cmd + 1 delimiter createSafeString(input, maxCmdLength + 1); // to read input cmd + 1 delimiter createSafeString(token, maxCmdLength + 1); // for parsing capacity >= input.capacity() char delimiters[] =" .,\ \ "; // space dot comma CR NL are cmd delimiters void setup() { Serial.begin(9600); // Open serial communications and wait a few seconds SafeString::setOutput(Serial); // enable error messages and debug() output to be sent to Serial } void loop() { input.read(Serial); // read from Serial, returns true if at least one character was added to SafeString input if (input.nextToken(token, delimiters)) { // process at most one token per loop does not return tokens longer than input.capacity() if (token == onCmdStr) { Serial.println("switching on"); digitalWrite(ledPin, HIGH) } else if (token == offCmdStr) { Serial.println("switching off"); digitalWrite(ledPin, LOW); }// else // not a valid cmd ignore } } |
解决了您的代码是正确的,您只需要将arduino终端设置为"无行结尾",您还忘记编写此Serial.println(" switching off");
感谢您分享您的代码,我也在使用您的代码,谢谢!!
我看到您尝试创建一些类似的命令行解释器进行测试;
您可以使用Arduino的串行命令行解释器或仅查看代码及其工作方式。
这不是答案,但有帮助=)