我在下面的代码中是从this forum获得的。它不适合我,但他们声称代码很好。我已经尝试了几种字符串比较方法,例如string.equals(string)
和标准==
运算符,但仍然没有运气。
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="";
}
}
答案 0 :(得分:12)
我能够通过在字符串比较之前添加readString.trim();
来解决昨晚的问题。这是因为会有一个换行符,其中id没有在arduino控制台中打印任何内容。
我将函数放在下面的代码中:
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="";
}
}
答案 1 :(得分:4)
我只使用' '
(单个)代替" "
(双倍)
char c = Serial.read();
if (c == '1'){ //do something}
答案 2 :(得分:3)
为什么不使用Serial.readString(); ??
试试这个..
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);
}
}
}
答案 3 :(得分:0)
新的SafeString Arduino库(可从库管理器中获得)使此操作变得简单而安全。与Arduino Strings不同,SafeStrings不会导致草图重新启动,也不会引起堆碎片化。
请参见https://www.forward.com.au/pfod/ArduinoProgramming/SafeString/index.html
上的详细教程SafeString易于调试。 SafeString提供详细的错误消息,包括所涉及的SafeString的名称,以帮助您使程序正确运行。
安全字符串安全可靠。即使您的代码传递了空指针或'\ 0'参数或超出了安全字符串的可用容量,安全字符串也不会导致重新启动并且始终处于有效的可用状态。
SafeString程序永远运行。 SafeString完全避免内存碎片,最终将导致您的程序失败,并且在作为参数传递时从不进行额外的复制。
SafeString更快。 SafeString不会创建多个副本或短暂的对象,也不会执行不必要的数据复制。
SafeString还具有标记化/解析方法。可能详尽的示例之一包括库封面,其中读取用户输入并解析命令,同时使其余草图以最大速度运行。在SafeString方法中没有邪恶的delay()可以停止草图中的轨迹。
注意:在下面的示例代码中,SafeString的大小很小,但是该代码可以处理来自用户的任意长输入。
用户串行输入,如
这是打开和关闭等很长的输入
可以很好地处理和解析。
SafeString还具有广泛的调试和错误消息,以帮助您查找和解决编码问题。
#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[] = " .,\r\n"; // 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
}
}
答案 4 :(得分:-1)
我看到你尝试为测试创建一些类似命令行的解释器;
您可以使用Serial command line interpreter for Arduino或只查看代码,以及它是如何工作的。
这不是答案,但有些帮助=)
答案 5 :(得分:-1)
解决了你的代码是对的你只需要设置arduino终端"没有行结束"你也忘了写这个Serial.println("关掉");
并感谢您分享您的代码我也在使用您的代码谢谢!!