Arduino从串行线读取字符串并进行比较

标签 arduino serial-port string-comparison

我正在尝试从串行线路读取字符串并将其与命令列表进行比较。如果该字符串是有效命令,Arduino 应该继续执行某些操作,并在串行线上返回一些信息。 然而,我的comaprison总是失败(给我“不是有效的命令响应”)。我尝试从 Arduino 串行监视器和 Python 脚本发送“temp”一词。

我的arduino代码:

int sensorPin = 0; // Sensor connected to A0
int ledPin = 13; // Led connected to 13
int reading = 0; // Value read from A0

float voltage = 0; // Voltage we read
float temperatureC = 0; // Temperature we measure

String inputString= ""; // Set string empty
String Temperature = "temp"; // The command we are looking for

boolean stringComplete = false; // See if we are done reading from serial line



void setup() {
  Serial.begin(9600);  
  pinMode(ledPin, OUTPUT);
  inputString.reserve(200); // Reserve space for inputString in memory
}

void serialEvent() {
  // Read data from serial line until we get a \n.
  // Store data in inputString
  while (Serial.available()){
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n'){
      stringComplete = true;
    }
  }
}

void loop() {
  serialEvent(); // See if there are data on serial line and get it
  if (stringComplete){ // If we are done reading on serial line
    if (inputString == Temperature){ //WHY YOU FAIL ME?
      digitalWrite(ledPin, HIGH);
      voltage = (analogRead(sensorPin) * 5.0)/1024.0;
      temperatureC = (voltage - 0.5) * 100;
      Serial.print(voltage); Serial.println(" volts");
      Serial.print(temperatureC); Serial.println(" degrees C");
      delay(5000);
      digitalWrite(ledPin, LOW);
  }
  else{
    Serial.print("Not a valid command:");
    Serial.print(' '+inputString);
  }
  // Reset so we can wait for a new command
  inputString = "";
  stringComplete = false;
  }
}

最佳答案

首先,我会避免使用String对象。在我看来,最好只使用 char 数组。它们更轻,并且避免了内存分配和释放。

顺便说一句,如果稍后您要为其分配一个新的空字符串,为什么还要保留该空间?

无论如何,我认为问题在于您还将新行附加到字符串中。此外,在 Windows 环境中,新行是 '\r' 后跟 '\n',因此在 Win 和 Linux 中您会得到不同的行为。

我只是替换

inputString += inChar;
if (inChar == '\n'){
  stringComplete = true;
}

if ((inChar == '\r') || (inChar == '\n')){
  stringComplete = (inputString.length() > 0);
} else {
  inputString += inChar;
}

编辑:我还会在 stringComplete 情况下添加一个中断,因为否则无法检测到多个命令。所以:

if ((inChar == '\r') || (inChar == '\n')){
  if(inputString.length() > 0) {
    stringComplete = true;
    break;
  }
} else {
  inputString += inChar;
}

关于Arduino从串行线读取字符串并进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33012185/

相关文章:

c++ - 无效使用 void 表达式,怎么办?

python - 在 python 和 arduino 之间共享枚举

ruby - 连接到串行端口时权限被拒绝?

bluetooth - 如何在处理中设置串行通信到/dev/rfcomm0

c - 等待代码时运行代码

c++ - Arduino:无法将取消引用的指针值从库函数返回到草图

python - 是否可以与/dev/bus/usb/<bus>/<device> 进行串行通信

string - 根据 unicode 对字符串进行排序

java - 检查java中单词的文本文件中是否包含字符串

algorithm - 比较两棵树之间差异的算法有哪些?