Forum: Mikrocontroller und Digitale Elektronik elm-chan FATFS


von Julian (Gast)


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)


Lesenswert?

Was sagt dein Debugger?

von pitschu (Gast)


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)


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


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.