用esp8266解析SD卡数据
SD card data parsing with esp8266
我需要一些帮助来从 SD 卡中提取数据我基于 this 部分的代码。
当我从 SD 卡读取数据并将其显示到串口时,代码可以正常工作,但是当我将数据传递到 char* 数组并调用循环数组的函数时,数组显示垃圾(一些不可读的数据)。我正在尝试制作一个函数,我可以使用它以文本文件格式调用从 SD 卡存储的不同设置。
我有一个名为的全局变量:
char* tempStoreParam[10];
这将存储要处理的临时数据。文本文件中存储的数据是这种格式
-n.command
其中:n = 要存储在 tempStoreParam[10]
中的数据的 int 编号和索引位置,命令是要存储在 tempStoreParam[10]
.
中的 char* 数组
示例:
-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"};
您的代码有一些问题 - 按顺序:
本例中 read 的 return 值是一个 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
完成后创建的数组/再次读取文件之前。
我需要一些帮助来从 SD 卡中提取数据我基于 this 部分的代码。
当我从 SD 卡读取数据并将其显示到串口时,代码可以正常工作,但是当我将数据传递到 char* 数组并调用循环数组的函数时,数组显示垃圾(一些不可读的数据)。我正在尝试制作一个函数,我可以使用它以文本文件格式调用从 SD 卡存储的不同设置。
我有一个名为的全局变量:
char* tempStoreParam[10];
这将存储要处理的临时数据。文本文件中存储的数据是这种格式
-n.command
其中:n = 要存储在 tempStoreParam[10]
中的数据的 int 编号和索引位置,命令是要存储在 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"};
您的代码有一些问题 - 按顺序:
本例中 read 的 return 值是一个 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
完成后创建的数组/再次读取文件之前。