1

我需要一些帮助来从 SD 卡中提取数据,我基于节中的代码。

当我从 SD 卡读取数据并将其显示到串行端口时,代码有效,但是当我将数据传递到 char* 数组并调用将循环数组的函数时,数组显示垃圾(一些不可读的数据) . 我正在尝试制作一个函数,可以用来调用以文本文件格式从 SD 卡存储的不同设置。

我有一个名为的全局变量:

char* tempStoreParam[10]; 

它将存储要处理的临时数据。文本文件中存储的数据就是这种格式

-n.command

其中: n = int 数和要存储在tempStoreParam[10]and 命令中的数据的索引位置是要存储在 中的 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 回答