如何比较Serial.read()中的字符串?

时间:2014-07-25 17:33:41

标签: serial-port arduino

我在下面的代码中是从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="";
  } 
}

6 个答案:

答案 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("关掉");

并感谢您分享您的代码我也在使用您的代码谢谢!!