2013-06-06 4 views
2

J'essaie de créer une liste de fichiers sur ma carte SD c'est assez facile à faire une fois mais au moment où je lance le programme plus d'une fois la liste soit raccourcie ou le programme dit il n'y a pas de fichiers du tout. Pour simplifier le plus possible, j'utilise l'exemple SD fourni avec la bibliothèque SD arduino et je mets juste la partie setup (qui devrait normalement être exécutée une fois) dans la partie loop. Voici ce que j'ai avec ça.comment revérifier le fichier dans la carte SD Arduino

#include <SD.h> 

File root; 

void setup() 
{ 
// Open serial communications and wait for port to open: 
Serial.begin(9600); 
while (!Serial) { 
    ; // wait for serial port to connect. Needed for Leonardo only 
} 


Serial.print("Initializing SD card..."); 
// On the Ethernet Shield, CS is pin 4. It's set as an output by default. 
// Note that even if it's not used as the CS pin, the hardware SS pin 
// (10 on most Arduino boards, 53 on the Mega) must be left as an output 
// or the SD library functions will not work. 
    pinMode(10, OUTPUT); 

if (!SD.begin(10)) { 
    Serial.println("initialization failed!"); 
    return; 
} 
Serial.println("initialization done."); 


} 

void loop() 
{ 
    Serial.println("hit any key then enter to run the list"); 
    while(!Serial.available()) 
    {;} 
    Serial.read(); 
    root = SD.open("/"); 

    printDirectory(root, 0); 

Serial.println("done!"); 

// nothing happens after setup finishes. 
    } 

void printDirectory(File dir, int numTabs) { 
    while(true) { 

    File entry = dir.openNextFile(); 
    if (! entry) { 
    // no more files 
    //Serial.println("**nomorefiles**"); 
    break; 
    } 
    for (uint8_t i=0; i<numTabs; i++) { 
    Serial.print('\t'); 
     } 
    Serial.print(entry.name()); 
    if (entry.isDirectory()) { 
    Serial.println("/"); 
    printDirectory(entry, numTabs+1); 
    } else { 
    // files have sizes, directories do not 
    Serial.print("\t\t"); 
    Serial.println(entry.size(), DEC); 
    } 
} 
} 

Mais je reçois cette sortie bizarre après l'exécution, il

Initialiser carte SD ... initialisation fait.

a frappé une touche puis entrez pour exécuter la liste

HFBVYRG.TXT 7

THBVFG.TXT 7

WAZXDSQ.TXT 7

QAZXSW.TXT 21

WSXZAQ .TXT 7

1478523.TXT 7

QWSDFRE.TXT 7

ZXCVBNM.TXT 7

MKOLIJY.TXT 7

fait!

a frappé une touche puis entrez pour exécuter la liste

HFBVYRG.TXT 7

THBVFG.TXT 7

WAZXDSQ.TXT 7

QAZXSW.TXT 21

WSXZAQ .TXT 7

1478523.TXT 7

QWSDFRE.TXT 7

ZXCVBNM.TXT 7

MKOLIJY.TXT 7

fait!

a frappé une touche puis entrez pour exécuter la liste

HFBVYRG.TXT 7

THBVFG.TXT 7

WAZXDSQ.TXT 7

QAZXSW.TXT 21

fait!

a frappé une touche puis entrez pour exécuter la liste

fait!

a frappé une touche puis entrez pour exécuter la liste

fait!

a frappé une touche puis entrez pour exécuter la liste

fait!

a frappé une touche puis entrez pour exécuter la liste

///////////////////////////////// ////////////////////////////////////////////////////////////////////// Comme vous pouvez le voir, il devient de plus en plus court, puis s'arrête tout simplement.

Est-ce que quelqu'un a des idées pourquoi?

J'ai essayé de jouer avec des pointeurs et de fermer et rouvrir le fichier mais je n'ai rien trouvé.

Toutes les idées seraient grandement appréciées.

Répondre

3

Aucun résultat ne peut provenir d'incompatibilité entre open() et close(). Vous ouvrez le répertoire racine chaque passage dans la boucle:

root = SD.open("/"); 

mais jamais

root.close(); 

D'abord, corriger cette erreur et de vérifier aussi que lorsque vous ouvrez la racine que vous réussissez avant d'essayer d'imprimer une liste :

root = SD.open("/"); 
if(root) { 
    printDirectory(root, 0); 
    Serial.println("done!"); 
    root.close(); 
} 
else { 
    Serial.println("failed to open directory"); 
} 

Deuxièmement, fermez les fichiers qui sont ouverts à la marche du répertoire

void printDirectory(File dir, int numTabs) { 

    while(true) { 
    File entry = dir.openNextFile(); 
    ... 
    entry.close(); 
    } 
    return; 
} 

Enfin, ne pas bloquer dans la boucle(). D'autres choses peuvent se produire en dehors de votre boucle() et elles seront bloquées indéfiniment en fonction du temps que vous attendez pour appuyer sur une touche. Un modèle de code plus typique consiste à tourner de manière sauvage à travers la boucle() plutôt que de bloquer l'attente de l'entrée de l'utilisateur. Par exemple:

boolean bNeedPrompt = true; 

void loop() { 
    // Show the prompt once, then mark as displayed so that text does not 
    // continuously scroll on the screen 
    if(bNeedPrompt) { 
    Serial.println("hit any key then enter to run the list"); 
    bNeedPrompt = false; 
    } 

    if(Serial.available()) { 
    Serial.read(); 
    // do action 
    // set flag so that prompt will display again 
    bNeedPrompt = true; 
    } 

    return; 
} 
+0

Je ne peux pas vous dire à quel point je suis heureux hahahahah !!! Merci beaucoup cela m'a embêté pendant des jours. Je vais jeter un bon coup d'oeil à votre code mais la première fois que je l'ai fait sur le code de base ça a fonctionné parfaitement :) Juste une dernière chose mais c'est juste pour la connaissance générale savez-vous pourquoi il a donné la liste deux fois ? Si vous ne savez pas, je ne me dérange pas MERCI ENCORE – Spider999

+0

OMG! C'est aussi une solution à mon problème. merci! – XBasic3000

1

La réponse de jdr5ca traite beaucoup des problèmes avec votre configuration - par les fichiers fermeture que vous allez avoir des ressources qui ne fuient mettre fin à bien. Il est particulièrement important sur une configuration de mémoire aussi faible que l'Arduino, qui n'a que 2k RAM pour les puces d'origine, ce qui vaut la peine de garder à l'esprit tout au long de votre code.

Réponse courte pour votre question restante: il ne sera pas entièrement prévisible, mais la mémoire faible est probablement la cause de votre problème. Lire la suite pour plus de détails.

J'ai eu des expériences similaires avec la bibliothèque SD récemment, mais pas avec une cause si évidente. J'ai trouvé que si la mémoire libre sur mon système est inférieure à environ 500 octets (un quart de la RAM totale) alors la bibliothèque SD commence à se comporter très bizarrement en essayant de lister les répertoires.

j'ai vu des choses semblables à vous, par exemple:

  1. entrées de la liste sous le répertoire racine et trouver deux sous-répertoires
  2. entrées de la liste dans l'un de ces sous-répertoires, a bien fonctionné
  3. liste entrées sous le répertoire racine et maintenant je ne trouve qu'un seul sous-répertoire! Celui dont j'avais énuméré le contenu a disparu!
  4. Je pourrais toujours énumérer le contenu du sous-répertoire fin, à savoir. il est toujours là!
  5. réinitialisation de l'Arduino et recommencer a donné les mêmes résultats, ce qui montre encore une fois que les fichiers étaient encore présents sur la carte SD

Je pense que tout cela se résume à la bibliothèque SD étant à la fois très gourmands en mémoire (#include SD.h utilise jusqu'à 500 octets de la chauve-souris!), Et ne pas manipuler les erreurs de mémoire faible particulièrement évidemment.

Donc, si les choses agissent étrangement alors:

  1. Vérifiez votre utilisation de la mémoire (voir par exemple freeRam() de http://playground.arduino.cc/Code/AvailableMemory.)

  2. réduire votre consommation de mémoire où cela est possible. Pour rude:

    • supprimer les bibliothèques que vous n'avez pas besoin
    • se débarrasser de toutes les chaînes codées dur que vous n'avez pas besoin
    • pour les chaînes codées en dur que vous faites (par exemple dans les appels à Serial.print().) besoin de les rendre aussi court que possible, et les stocker en flash (par exemple Serial.print(F("String in flash"));) plutôt que de la RAM
    • vous ne pouvez pas coller des chaînes de format en flash actuellement, par exemple pour snprintf), donc évitez de les utiliser et ne faites que sortie manuelle (elle est plus longue mais enregistre la mémoire)
    • assurez-vous que vous utilisez les types de variables appropriés partout (ie. le type le plus petit qui conviendra à vos besoins) - particulièrement important si vous avez des tableaux, pour des raisons évidentes!
Questions connexes