1

使用 Arduino IDE,我试图从 Serial 中读取一个字符串,在我需要处理它之后,从中分离一些字节。字符串以 开头@和结尾;。数据的“部分”是:

  • 字节 0:“@”
  • 字节 1 到 3:节 A,它是一个整数
  • 字节 3 到 6:部分 B,它是一个整数
  • 字节 7 到 63:C 部分,它是一个浮点数

例如,如果我有字符串@002001100.0;,A 部分是 002,B 部分是 001,C 部分是 100.0。

为了从 Serial 中读取整个字符串,我正在做

  char UsartBuffer = 0;
  char UsartString[64];

  boolean commandReceived = false;
  if (Serial.available() >0) {
    UsartBuffer = Serial.read();
    UsartString[0] = UsartBuffer;
    int counter = 0;

    if (UsartBuffer == '@'){
      while (UsartBuffer != ';'){
        if (Serial.available() >0){
          UsartBuffer = Serial.read();
          if (UsartBuffer != ' '){
            counter++;
            UsartString[counter] = UsartBuffer;
          }
        }

      }
      UsartString[counter+1]='\0';
      commandReceived = true;
    }
  }

为了分割我所做的字符串

char* getClass(String command){
  char returnStr[3];
  for (int i = 0; i < 3; i++){
    returnStr[i] = command[i+1];
  }
  return returnStr;
}

char* getSubClass(String command){
  char returnStr[3];
  for (int i = 0; i < 3; i++){
    returnStr[i] = command[i+4];
  }
  return returnStr;
}

char* getDataValue(String command){
  char returnStr[56];
  int lastByte = 56;
  for (int i=0; i<56; i++){
    if (command[i+7]==';'){
      lastByte = i;
      break;
    }
  }

  for (int i = 0; i < lastByte; i++) returnStr[i] = command[i+7];
  for (int i = lastByte; i < 56; i++) returnStr[i] = '/0';
  return returnStr;
}

当我这样做的时候

if (commandReceived){
  Serial.println(UsartString);
  Serial.println(getClass(UsartString));
  Serial.println(getSubClass(UsartString));
  Serial.println(getDataValue(UsartString));
}

我得到了甚至奇怪的结果:

@002000107.0;
a

!œ
107.0Ñ

因此,同样,我做错了什么?

提前致谢。

4

1 回答 1

1

问题似乎是由于getClass(),getSubClass()getDataValue()返回局部变量 ( returnStr)。一旦函数返回,这些值就会丢失。

避免这种情况的几种方法:

返回一个String对象(本地String将在函数退出时被复制):

String getClass(String command) {
    String returnStr;
    for (int i = 0; i < 3; i++) {
        returnStr += command[i+1];
    }

    return returnStr;
}

在函数内动态分配char*(使用malloc())-如果你这样做,你需要小心之后释放它(使用free()):

char* getClass(String command) {
    size_t length = 3;
    char* returnStr = (char*) malloc(length);
    for (int i = 0; i < length; i++) {
        returnStr[i] = command[i+1];
    }

    return returnStr;
}

// Usage
char* classStr = getClass(UsartString);
Serial.println(classStr);
free(classStr);

将预先分配的char数组传递给函数 - 这可以是调用函数中的局部变量:

void getClass(String command, char* returnStr) {
    for (int i = 0; i < 3; i++) {
        returnStr[i] = command[i+1];
    }

    return returnStr;
}

// Usage
char returnStr[3];
getClass(UsartString, returnStr);
Serial.println(returnStr);
于 2013-02-18T10:02:15.877 回答