1

Arduino IDEを使用して、Serialから文字列を読み取ろうとしていますが、処理する必要があった後、いくつかのバイトを分離しています。文字列はで始まり、@で終わります;。データの「部分」は次のとおりです。

  • バイト0:「@」
  • バイト1から3:整数であるセクションA
  • バイト3から6:整数であるセクションB
  • バイト7から63:フロートであるセクションC

たとえば、文字列がある場合@002001100.0;、セクションAは002、セクションBは001、セクションCは100.0です。

シリアルから文字列全体を読み取るために、私はやっています

  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 に答える