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

Serial port 如何比较Serial.read()中的字符串?,serial-port,arduino,Serial Port,Arduino,我有下面的代码,我从那里得到的,我遵循了。这对我不起作用,但他们声称代码很好。我已经尝试了几种字符串比较方法,比如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

我有下面的代码,我从那里得到的,我遵循了。这对我不起作用,但他们声称代码很好。我已经尝试了几种字符串比较方法,比如
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="";
  } 
}

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

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

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

我看到您试图为测试创建一些类似命令行的解释器

您可以使用或只是查看代码,了解其工作原理


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

我只是用
'
(单)而不是
'
(双)


解决你的代码是正确的,你只需将arduino终端设置为“无线路结束”,你还忘了写这个序列。println(“关闭”)


谢谢分享你的代码我也在使用你的代码谢谢

为什么不使用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);
        }
      }
    }

新的SafeString Arduino库(可从库管理器获得)使此操作变得简单和安全。与Arduino字符串不同,SafeStrings不会导致草图重新启动,也不会导致堆碎片化

请参阅上的详细教程

安全字符串易于调试。安全字符串提供详细的错误消息,包括有问题的安全字符串的名称,以帮助您正确运行程序

SafeStrings是安全且健壮的。SafeStrings不会导致重新启动,并且始终处于有效的可用状态,即使您的代码传递空指针或“\0”参数或超出SafeString的可用容量

SafeString程序永远运行。SafeString完全避免了内存碎片,内存碎片最终会导致程序失败,并且在作为参数传递时,不会产生额外的副本

安全字符串速度更快。安全字符串不会创建多个副本或短期对象,也不会对数据进行不必要的复制

SafeString还具有标记化/解析方法。库中可能包含的一个详细示例包括读取用户输入和解析命令,同时保持草图的其余部分以最大速度运行。SafeString方法中没有邪恶的delay(),用于停止其中的草图

注意:在示例代码中,SafeStrings的大小很小,但代码可以处理用户的任意长输入

用户串行输入,如
这是一个长时间的输入开关等
处理和解析都很好

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
  }
}

在比较字符串之前,首先必须确保字符串长度相等。使用delay()是非常不可靠和浪费的,请使用特定字符标记字符串的结尾。与“\n”类似。您可以使用
Serial.readString()
,而不是自己循环构建
readString
。它会自动为您执行所有这些操作,甚至会删除换行符。+1用于从串行数据中收集c上的字符,然后将其像StringBuilder一样存储在readString上。如果我使用strcmp()或strncmp()来比较char,我会遇到一个问题,它一直在告诉我如何强制转换const char*。
#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
  }
}