拆分数组char来自Arduino IDE中的Serial

时间:2013-02-18 02:06:47

标签: java c string char arduino

使用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Ñ

因此,我做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分: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);