关于arduino:如何比较Serial.read()中的字符串?

How to compare string from Serial.read()?

下面是我从这个论坛获得的代码。它对我不起作用,但是他们声称代码很好。我已经尝试了几种字符串比较方法,例如string.equals(string)和标准的==运算符,但仍然没有运气。

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="";
  }
}


我可以通过在字符串比较之前简单地添加readString.trim();来解决昨晚的问题。这是因为在arduino控制台中,将有换行符,其中id没有显示任何内容。

我将函数放置在下面的代码中:

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的串行命令行解释器或仅查看代码及其工作方式。

这不是答案,但有帮助=)