1

このセクションのコードに基づいて、SD カードからデータを抽出するための支援が必要です。

SD カードからデータを読み取ってシリアル ポートに表示すると、コードは機能しますが、データを char* 配列に渡し、配列をループする関数を呼び出すと、配列にゴミが表示されます (一部の読み取り不能データ)。 . SDカードからテキストファイル形式で保存されたさまざまな設定を呼び出すために使用できる機能を作成しようとしています。

次の名前のグローバル変数があります。

char* tempStoreParam[10]; 

処理する一時データを保存します。テキストファイルに格納されるデータはこの形式です

-n.command

ここで: n = に格納されるデータの int 番号とインデックス位置、tempStoreParam[10]コマンドは に格納される char* 配列tempStoreParam[10]です。

例:

-1.readTempC

-2.readTempF

-3.setdelay:10

-4.getIpAddr

コード スニペットは次のとおりです。

while (sdFiles.available()) {
  char sdData[datalen + 1];
  byte byteSize = sdFiles.read(sdData, datalen);
  sdData[byteSize] = 0;
  char* mList = strtok(sdData, "-");
  while (mList != 0)
  {
    // Split the command in 2 values
    char* lsParam = strchr(mList, '.');
    if (lsParam != 0)
    {
      *lsParam = 0;
      int index = atoi(mList);
      ++lsParam;
      tempStoreParam[index] = lsParam;
      Serial.println(index);
      Serial.println(tempStoreParam[index]);
    }
    mList = strtok(0, "-");
  }
} 

私は次の結果を得ようとしています:

char* tempStoreParam[10] = {"readTempC","readTempF","setdelay:10","getIpAddr"};
4

1 に答える 1

0

あなたのコードにはいくつかの問題があります - 順番に:

このインスタンスの read の戻り値は 32 ビット整数です。つまり、ファイルの内容が 255 バイトを超えると、文字列が誤って終了し、内容を正しく読み取ることができなくなります。つまり、バイト値に切り捨てています。

byte byteSize = sdFiles.read(sdData, datalen);

次に、次の行を使用して、スタック変数のアドレスをtempStoreParam配列に格納しています。

tempStoreParam[index] = lsParam;

sdDataさて、これは機能しますが、範囲内に留まる期間のみです。その後、sdData使用できなくなり、おそらくゴミが発生する可能性があります。あなたがしようとしている可能性が最も高いのは、データのコピーを取得して に配置することtempStoreParamです。これを行うには、次のようなものを使用する必要があります。

// The amount of memory we need is the length of the string, plus one 
// for the null byte
int length = strlen(lsParam)+1

// Allocate storage space for the length of lsParam in tempStoreParam
tempStoreParam[index] = new char[length];

// Make sure the allocation succeeded 
if (tempStoreParam[index] != nullptr) {
   // Copy the string into our new container
   strncpy(tempStoreParam[index], lsParam, length);
}

この時点で、その文字列を関数の外で正常に渡すことができるはずです。注意として、deleteファイルを再度読み取る前に、作成した配列を作成する必要があります。

于 2016-11-04T17:27:57.593 に答える