2016-11-04 2 views
1

Мне нужна помощь для извлечения данных с SD-карты. Я основываю свой код на this.Анализ данных SD-карты с esp8266

Код работает, когда я считываю данные с SD-карты и отображаю их в последовательный порт, но когда я передаю данные в массив char * и вызываю функцию, которая будет зацикливать массив, массив отображает мусор (некоторые нечитаемые данные). Я пытаюсь сделать функцию, которую я могу использовать для вызова различных настроек, хранящихся на SD-карте, в текстовом формате.

У меня есть глобальная переменная с именем:

char* tempStoreParam[10]; 

Какой будет хранить временные данные, чтобы процесс. Данные, сохраненные в текстовом файле в этом формате

-n.command

Где: n = INT номер и индекс местоположение данных, подлежащие хранению в tempStoreParam[10] и команде является символом * массив хранится в 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"}; 
+0

Спасибо за исправление, Aniket –

ответ

0

Ваш код имеет несколько проблем - в следующем порядке:

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

Смежные вопросы