Forum: Mikrocontroller und Digitale Elektronik FatFs länge einer Datei nach µC Reset


von martn (Gast)


Lesenswert?

Hallo,

ich habe FatFs am laufen und versuche nun damit klar zu kommen.
http://elm-chan.org/fsw/ff/00index_e.html

Mein Problem ist gerade folgendes.

Ich kann eine Datei "Test.txt" erstellen und darin z.b. den String 
"12345" ablegen und die Datei ordnungsgemäß schließen.
Wenn der µC aus dem Reset kommt, will ich in die Datei "Test.txt" 
weitere Zeichen ablegen. Also z.B. "6789".
Diese sollen aber nicht die alte Information überschreiben sondern es 
soll angehängt werden. Ich muss also wissen, wie viele Zeichen sich in 
der Datei "Test.txt" befinden und kann dann "FIL* fp" manipulieren, 
damit an der richtigen Stelle weiter geschrieben wird.

Da diese Datei "Test.txt" bei momentaner Überlegung sehr groß werden 
kann,
macht es keinen Sinn, diese in einen Buffer des µC auszulesen.

Meine aktuelle Lösung ist eine separate zweite Datei anzulegen und darin 
z.B. die Informationslänge in der "Test.txt" abzulegen.

Bietet die FatFs eine bessere Möglichkeit?

von holger (Gast)


Lesenswert?

>Ich muss also wissen, wie viele Zeichen sich in
>der Datei "Test.txt" befinden

Nein musst du nicht.

>Bietet die FatFs eine bessere Möglichkeit?

Ja, f_open mit FA_OPEN_APPEND benutzen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Datei mittels f_open() und Flag FA_OPEN_APPEND öffnen, siehe

http://elm-chan.org/fsw/ff/doc/open.html

von Peter D. (peda)


Lesenswert?

1
fseek(fp, 0, SEEK_END);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und um dann noch die Dateigröße zu ermitteln (um beispielsweise zu 
entscheiden, die Datei dann doch nicht zu verlängern) dient f_size.

von martn (Gast)


Lesenswert?

Danke für die Antworten.

Leider unterstützt cubeMX die FatFs Version R0.13 für meinen STM32f4 wie 
es aussieht noch nicht.
CubeMX bindet die Version R0.11 ein und die unterstützt "FA_OPEN_APPEND" 
noch nicht.

Somit, da ich selber die cubeMX HAL und die FatFs nicht gescheit 
verbinden kann, habe ich untenstehende Lösung gewählt.

Wenn mir jemand vermitteln kann, wie ich oben genannte Verbindung 
manuell umsetzen kann, würde ich gerne auf die aktuelle Version R0.13 
der FatFs wechseln.
1
res = f_open(&myFile, "TEST3.TXT", FA_OPEN_ALWAYS | FA_WRITE);
2
if (res != FR_OK)
3
{
4
   // Fehler beim Erstellen oder Öffnen der Datei
5
6
}
7
8
int ret;
9
    
10
res = f_lseek(&myFile, f_size(&myFile));
11
12
ret = f_puts("Hallo1", &myFile);
13
ret = f_puts("Hallo2", &myFile);
14
ret = f_puts("Hallo3", &myFile);
15
16
f_close(&myFile);  // Schliessen der Datei

von Jim M. (turboj)


Lesenswert?

Ich hätte einfach die ff.c und ff.h im Projekt mit den R0.13 Versionen 
überschrieben, fertich.

von Denis K. (denis_tbg)


Lesenswert?

Hallo,

das Problem besteht bei mir immer noch. Nach einiger suche konnte ich 
etwas finden und hoffe einigen anderen damit helfen zu können.

Das ist der code von http://elm-chan.org/fsw/ff/res/app1.c
1
/*------------------------------------------------------------/
2
/ Open or create a file in append mode
3
/ (This function was sperseded by FA_OPEN_APPEND flag at FatFs R0.12a)
4
/------------------------------------------------------------*/
5
6
FRESULT open_append (
7
    FIL* fp,            /* [OUT] File object to create */
8
    const char* path    /* [IN]  File name to be opened */
9
)
10
{
11
    FRESULT fr;
12
13
    /* Opens an existing file. If not exist, creates a new file. */
14
    fr = f_open(fp, path, FA_WRITE | FA_OPEN_ALWAYS);
15
    if (fr == FR_OK) {
16
        /* Seek to end of the file to append data */
17
        fr = f_lseek(fp, f_size(fp));
18
        if (fr != FR_OK)
19
            f_close(fp);
20
    }
21
    return fr;
22
}
23
24
25
int main (void)
26
{
27
    FRESULT fr;
28
    FATFS fs;
29
    FIL fil;
30
31
    /* Open or create a log file and ready to append */
32
    f_mount(&fs, "", 0);
33
    fr = open_append(&fil, "logfile.txt");
34
    if (fr != FR_OK) return 1;
35
36
    /* Append a line */
37
    f_printf(&fil, "%02u/%02u/%u, %2u:%02u\n", Mday, Mon, Year, Hour, Min);
38
39
    /* Close the file */
40
    f_close(&fil);
41
42
    return 0;
43
}

Und zur Aussage von Jim M. (turboj) - Das funktioniert leider nicht, da 
sehr viele Abhängigkeiten in anderen Dateien vorhanden sind, die in der 
älteren Variante einfach noch nicht da war. Ich habe es ein paar Stunden 
lang versucht, und wenn ich dachte, "jetzt" war wieder irgendwo ein 
neuer Fehler,  fehlendes [c]#define[#/c] oder fehlende Funktion...

Wie gesagt, ich hoffe es hilft euch.
Grüße

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.