Forum: Mikrocontroller und Digitale Elektronik elm-chan FATFS


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Julian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich nutze die SD-Lib von Elm-Chan.
So nun b ich mal eine Frage und zwar habe ich auf der SD-Karte einen
Ordner "DATA" in dem Befinden sich mehrere Unterordner.

Nun wollt ich mittels FRESULT scan_files("DATA") mir die Unterordner in 
"DATA" anzeigen lassen aber alles hängt sich auf.

kann mir jemand weiterhelfen
mfg



1
scan_files("DATA");
2
3
4
5
6
7
8
FRESULT scan_files (
9
    char* path        /* Start node to be scanned (***also used as work area***) */
10
)
11
{
12
    FRESULT res;
13
    DIR dir;
14
    UINT i;
15
    static FILINFO fno;
16
17
18
    res = f_opendir(&dir, path);                       /* Open the directory */
19
    if (res == FR_OK) {
20
        for (;;) {
21
            res = f_readdir(&dir, &fno);                   /* Read a directory item */
22
            if (res != FR_OK || fno.fname[0] == 0) break;  /* Break on error or end of dir */
23
            if (fno.fattrib & AM_DIR) {                    /* It is a directory */
24
                i = strlen(path);
25
                sprintf(&path[i], "/%s", fno.fname);
26
                res = scan_files(path);                    /* Enter the directory */
27
                if (res != FR_OK) break;
28
                path[i] = 0;
29
            } else {                                       /* It is a file. */
30
                printf("%s/%s\n", path, fno.fname);
31
            }
32
        }
33
        f_closedir(&dir)
34
    }
35
36
    return res;
37
}

von J. F. (Firma: Père Lachaise) (rect)


Bewertung
0 lesenswert
nicht lesenswert
Was sagt dein Debugger?

von pitschu (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du übergibst einen const char* an die Funktion, aber innerhalb der 
Funktion hängst du mit sprintf an den path was dran. Dafür hat path aber 
keinen Platz mehr. Du solltest einen char buffer[] haben in den du zu 
Beginn der Funktion path reinkopierst.

von Julian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
pitschu schrieb:
> Du übergibst einen const char* an die Funktion, aber innerhalb der
> Funktion hängst du mit sprintf an den path was dran. Dafür hat path aber
> keinen Platz mehr. Du solltest einen char buffer[] haben in den du zu
> Beginn der Funktion path reinkopierst.

ahhh

Beim ersten Aufruf werden die Ordner korrekt angzeigt und wenn ich die 
Funktion nochmals Aufrufe dann fehlt ein Ordner.
1
char buff[256];
2
3
strcpy(buff, "DATA");
4
             
5
scan_files(buff);

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Julian schrieb:
> aber alles hängt sich auf.

Julian schrieb:
> Beim ersten Aufruf werden die Ordner korrekt angzeigt und wenn ich die
> Funktion nochmals Aufrufe dann fehlt ein Ordner.

Was denn nun? Hängt sich das Programm auf (Endlosschleife) oder fehlt 
nur ein Ordner?

Wenn letzteres, dann meinst Du, dass mit dieser Abfolge...
1
char buff[256];
2
strcpy(buff, "DATA");
3
scan_files(buff);    // erster Aufruf
4
scan_files(buff);    // zweiter Aufruf

... der Fehler reproduzierbar ist?

Der Ordner, der dann fehlt, wo steckt der bei der printf-Ausgabe des 
ersten Aufrufs?

a) am Anfang
b) in der Mitte
c) am Ende

Ist der Ordner, der fehlt, der einzige Unterordner unter /DATA? War er 
bei der Ausgabe der erste oder letzte Ordner, wenn man die sonstigen 
Dateien mal außen vor lässt?

Fragen über Fragen. Bitte genauere Beschreibungen liefern, sonst kommen 
mehr Gegenfragen als Dir lieb ist.

von Julian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:

> Was denn nun? Hängt sich das Programm auf (Endlosschleife) oder fehlt
> nur ein Ordner?
>
>
> Fragen über Fragen. Bitte genauere Beschreibungen liefern, sonst kommen
> mehr Gegenfragen als Dir lieb ist.

Funktioniert alles einwandfrei , ich hatte nur ein Fehler in der Ausgabe 
auf dem TFT.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.