Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino从串行行读取字符串并比较_Arduino_Serial Port_String Comparison - Fatal编程技术网

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

Arduino从串行行读取字符串并比较,arduino,serial-port,string-comparison,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 r

我试图从串行行读取一个字符串,并将其与命令列表进行比较。如果字符串是有效的命令,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;
  }
}

首先,我要避免使用
字符串
对象。在我看来,只使用字符数组更好。它们更轻,避免了内存分配和释放

顺便问一下,如果以后要为其分配一个新的空字符串,为什么要保留该空间

不管怎么说,我认为问题在于你在字符串后面加了新行。此外,在windows环境中,新行是一个
'\r'
,后跟一个
'\n'
,因此在Win和Linux中会有不同的行为

我只是换一个

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

编辑:我还要在stringComplete案例中添加一个中断,因为否则无法检测到multple命令。因此:

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

而不是

inputString += inChar;
inputString += inChar.trim(); 
inputString += inChar;