2016-11-04 1 views
1

J'ai besoin d'aide pour extraire des données d'une carte SD basée sur mon code de la section this. Le code fonctionne quand je lis les données de la carte SD et les affiche dans le port série, mais quand je passe les données dans un tableau char * et appelez une fonction qui boucle le tableau, le tableau affiche des ordures (certaines données illisibles). J'essaie de faire une fonction que je peux utiliser pour appeler différents paramètres stockés à partir de la carte SD dans un format de fichier texte.Analyse de données de carte SD avec esp8266

J'ai une variable globale nommée:

char* tempStoreParam[10]; 

qui permet de stocker des données temporaires pour être processus. Les données stockées dans le fichier texte est dans ce format

-n.command

Où: n = nombre int et l'emplacement de l'index des données à stocker dans la tempStoreParam[10] et commande est un tableau char * à stocké dans tempStoreParam[10].

Exemple:

-1.readTempC

-2.readTempF

-3.setdelay:10

-4.getIpAddr

Voici l'extrait de code:

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, "-"); 
    } 
} 

Je suis en train d'obtenir le résultat suivant:

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

Merci pour la correction, Aniket –

Répondre

0

Votre code a quelques problèmes - dans l'ordre:

La valeur de retour de la lecture dans ce cas est un entier de 32 bits - Vous tronquer à une valeur d'octet, ce qui signifie si le contenu du fichier sont toujours plus de 255 octets, vous mettra fin de manière incorrecte votre chaîne, et ne parviennent pas à lire correctement le contenu:

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

Deuxièmement, vous stockez l'adresse une variable de pile dans votre tableau tempStoreParam avec cette ligne:

tempStoreParam[index] = lsParam; 

Maintenant, cela fonctionnera, mais seulement pour combien de temps sdData reste portée. Après cela, sdData n'est plus valide à utiliser, plus probablement conduire à la poubelle que vous rencontrez. Ce que vous essayez probablement de faire est de prendre une copie des données pour les placer dans tempStoreParam. Pour ce faire, vous devez utiliser quelque chose comme ceci:

// 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); 
} 

À ce stade, vous devriez être en mesure de passer autour de cette chaîne en dehors de la fonction avec succès. Comme une note, vous devrez delete le tableau créé une fois que vous avez terminé avec lui/avant de lire le fichier à nouveau.