Разбор данных с SD-карты с помощью esp8266

Мне нужна помощь для извлечения данных с 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"};

1

Решение

У вашего кода есть несколько проблем — По порядку:

Возвращаемое значение 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 массив, созданный, как только вы закончите с ним / перед повторным чтением файла.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector