Forum: Mikrocontroller und Digitale Elektronik SD_Karte Directory erstellen


von Marco G. (grmg2010)


Lesenswert?

Moin,

ich versuche mich gerade am Schreiben auf SD-Karte. Dazu benutze ich die 
hier verlinkte Bibliothek von Daniel R.

Das Schreiben auf Datei funktioniert auch ganz gut, nun wollte ich ein 
neues Verzeichnis anlegen und dann darin die Datei erstellen. Ich 
bekomme jetzt von Atmelstudio die Meldung, "undefined reference to 
`ffmkdir' ", obwohl diese auch in der file.h zu finden sind, wie zum 
Beispiel "ffwrites()" auch.

Hier mal mein Code:
1
#define F_CPU 8000000UL
2
3
#include <stdlib.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6
7
#include "config.h"  
8
#include "file.h"
9
#include "fat.h"
10
#include "mmc.h"    
11
#include "uart.h"    
12
13
14
char buffer[];
15
int counter = 0;
16
unsigned char file_name[]="Output.txt";
17
unsigned char dir[]="test";
18
19
int main(void){
20
21
  DDRC |=(1<<DDC0);
22
  PORTC |= (1<<PC0);
23
24
  
25
  UART_Init();
26
27
  uart_puts("Boot");
28
29
  while (FALSE == mmc_init()){
30
    nop();
31
  }
32
33
  uart_puts("...");
34
35
  if(TRUE == fat_loadFatData()){
36
37
    uart_puts("Ok");
38
39
  }
40
  
41
  while(1){
42
    
43
      counter++;
44
      
45
      itoa(counter,buffer,10);
46
      PORTC ^=(1<<PC0); 
47
      
48
      ffmkdir(dir);
49
      ffcd(dir);
50
      
51
      // Datei existiert nicht, also anlegen !
52
      if(MMC_FILE_NEW == ffopen(file_name)){
53
      
54
        
55
       ffwrites(buffer);
56
57
       // Neue Zeile in der Datei
58
       ffwrite(0x0D);
59
       ffwrite(0x0A);
60
61
       // Schließt Datei
62
       ffclose();
63
       }
64
65
66
       // Datei existiert, also anhaengen !
67
      if(MMC_FILE_EXISTS == ffopen(file_name)){
68
69
    
70
       ffseek(file.length);   
71
72
       ffwrites("Countervalue: ");
73
       ffwrites(buffer);
74
75
       ffwrite(0x0D);
76
       ffwrite(0x0A);
77
       ffclose();
78
       }
79
     
80
    }
81
82
}

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> char buffer[];
> itoa(counter,buffer,10);

halte ich für sehr bedenklich. Die schreibst damit wild im Speicher rum

1
if(TRUE == fat_loadFatData()){
2
3
    uart_puts("Ok");
4
5
  }
und was ist wenn es schief gelaufen ist, dann machst du einfach weiter?

zu dem eigentlichen Problem:

> "undefined reference to `ffmkdir' ",
ist eine Fehlermeldung von Linker, es scheint also eine lib oder ein 
objekt-File zu fehler.

> obwohl diese auch in der file.h zu finden sind, wie zum
> Beispiel "ffwrites()" auch.
das hat nichts zu sagen.

von Marco G. (grmg2010)


Lesenswert?

Peter II schrieb:
>> char buffer[];
>> itoa(counter,buffer,10);
>
> halte ich für sehr bedenklich. Die schreibst damit wild im Speicher rum

Wie würdest du es denn besser lösen?

Das es eine Fehlermeldung von Linker ist hatte ich mir bereits gedacht; 
wie könnte ich den Fehler weiter eingrenzen, um zu erfahren was genau 
fehlt?

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> Wie würdest du es denn besser lösen?

eine größe für die Variabel vorgeben.

> Das es eine Fehlermeldung von Linker ist hatte ich mir bereits gedacht;
> wie könnte ich den Fehler weiter eingrenzen, um zu erfahren was genau
> fehlt?
schau doch mal nach, in welcher *.c Datei die Funktion ist, gehört die 
zu deinen Projekt?

von Marco G. (grmg2010)


Lesenswert?

Ok, bis auf die Fehlende Größe ist die Zeile also in Ordnung gewesen. 
Gut, dann vergebe ich eine Größe, um den Bereich einzugrenzen.

Die Funktion findet sich, genau wie ffwrites() in der Datei file.c. Dies 
File, wie auch die file.h gehören in mein Projekt. Es gibt auch die 
Objekt-Datei, file.o

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> Ok, bis auf die Fehlende Größe ist die Zeile also in Ordnung gewesen.
> Gut, dann vergebe ich eine Größe, um den Bereich einzugrenzen.

richtig, bis auf den Fehler ist alles richtig

> Die Funktion findet sich, genau wie ffwrites() in der Datei file.c. Dies
> File, wie auch die file.h gehören in mein Projekt. Es gibt auch die
> Objekt-Datei, file.o
merkwürdig, gibt es Warnungen?

von Marco G. (grmg2010)


Lesenswert?

Ja, aber nur folgende:   Line
pointer targets in passing argument 1 of 'ffwrites' differ in signedness

Also nichts zu den anderen Funktionen, nur zu ffwrites

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> Ja, aber nur folgende:   Line
> pointer targets in passing argument 1 of 'ffwrites' differ in signedness
>
> Also nichts zu den anderen Funktionen, nur zu ffwrites

dann behebe das doch erst mal.

von Marco G. (grmg2010)


Lesenswert?

Behoben. Der Fehler ist aber leider weiterhin vorhanden. Nur alle 
Warnungen sind zurückgesetzt.

von Peter II (Gast)


Lesenswert?

suche mal ein der objekt Datei nach "ffmkdir".

von Marco G. (grmg2010)


Lesenswert?

in der File.o? Wenn ich die mit Notepad++ öffne, kommt nur Datenwirrwar 
heraus.

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> in der File.o? Wenn ich die mit Notepad++ öffne, kommt nur Datenwirrwar
> heraus.

egal, suche einfach den dem string.

von Marco G. (grmg2010)


Lesenswert?

Gibt es nicht, ich finde nur ffwrites und ffwrite

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> Gibt es nicht, ich finde nur ffwrites und ffwrite

lade mal die file.c hoch.

von Marco G. (grmg2010)


Angehängte Dateien:

Lesenswert?

Ok, wie ich in meinem Eingangspost bereits erwähnt hatte habe ich sie 
aber nicht selbst geschrieben.

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> Ok, wie ich in meinem Eingangspost bereits erwähnt hatte habe ich sie
> aber nicht selbst geschrieben.

merkwürde Datei...


#if (MMC_WRITE==TRUE && MMC_MKDIR==TRUE)

hast du diese defines auch gesetzt?

von Marco G. (grmg2010)


Lesenswert?

Das fand ich auch.

Nein, müsste ich das noch zusätzlich?

: Bearbeitet durch User
von Marco G. (grmg2010)


Lesenswert?

Deine Frage hat mich zur Lösung geführt. Ich muss in der config.h die 
Funktion zum Erstellen erst einschalten. Standardmäßig ist sie auf false 
gesetzt.

Danke für deine Hilfe :)

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> Deine Frage hat mich zur Lösung geführt. Ich muss in der config.h die
> Funktion zum Erstellen erst einschalten. Standardmäßig ist sie auf false
> gesetzt.
>
> Danke für deine Hilfe :)

normalerweise müssten die gleiche abfragen auch in der Header Datei drin 
sein, dann hätte man direkt einen Compiler-fehler erhalten.

Auch das "unsigned char" für String halte ich verbesserungswürdig.

von Marco G. (grmg2010)


Lesenswert?

Welchen Daten-Typ würdest du als String vorschlagen?

von Peter II (Gast)


Lesenswert?

Marco G. schrieb:
> Welchen Daten-Typ würdest du als String vorschlagen?

char*

von Marco G. (grmg2010)


Lesenswert?

Ich habe noch ein wenig weiter "experimentiert" und den Code erweitert.
Ich übergebe einem MCP4921 WErte und lese sie wieder über den internen 
ADC ein. Die eingelesenen Werte schreibe ich auf die SD-Karte. 
Merkwürdigerweise ignoriert er das vorhandene File und legt alle ca 
6-7Werte ein neues File mit selben Namen an, was ja eigentlich schon 
nicht geht.
Ist das ein Problem der Programmierung, oder ein Problem unter Windows 
(wenn ich die Daten mir ansehen möchte).

Hier noch mal der Code dazu:
1
#define F_CPU 8000000UL
2
3
#define VTESC uart_putc(0x1b)            //Definieren des Befehls 'VTESC'
4
#define VTAUTO uart_puts(">")            //Definieren des Befehls 'VTAuto'
5
#define VTPosZero uart_puts("[f")          //Definieren des Befehls 'VTPosZero'
6
#define VTRESET uart_puts("c")            //Definieren des Befehls 'VTReset'
7
#define VTCLSLine uart_puts("[K")          //Definieren des Befehls 'VTCLSLine'
8
#define VTCLSbelow uart_puts("[2J")          //Definieren des Befehls 'VTCLSbelow'
9
#define VTCURSERoff uart_puts("[?25l")        //Definieren des Befehls 'VTCURSERoff'
10
#define VTdown uart_puts("#3")            //Definieren des Befehls 'VTdown'
11
#define VTup uart_puts("#4")            //Definieren des Befehls 'VTup'
12
#define VTUnderline uart_puts("[4m")        //Definieren des Befehls 'VTUnderline'
13
#define VTnormal uart_puts("[0")          //Definieren des Befehls 'VTnormal'
14
#define LF uart_putc(0x0A)              //Definieren des Befehls 'LF'
15
#define CR uart_putc(0x0D)              //Definieren des Befehls 'CR'
16
17
#include <avr/io.h>
18
#include <util/delay.h>
19
#include <avr/interrupt.h>
20
#include <stdlib.h>
21
#include "avr.h"
22
#include "mcp4921.h"
23
#include "UART.h"
24
#include "SPI.h"
25
#include "ADC.h"
26
#include "VT100.h"
27
28
#include "config.h"  // Hier werden alle nötigen Konfigurationen vorgenommen, umbedingt anschauen !
29
#include "file.h"
30
#include "fat.h"
31
#include "mmc.h"
32
33
char buffer[15], buffer1[15], buffer2[15], buffer3[15], buffer_adc[20];
34
int counter = 256;
35
int counter_high = 0;
36
volatile int test = 0;
37
uint16_t adc_result;
38
int next = 0, input, counter_sd = 0;
39
char number;
40
double ADC_value = 0.0;
41
unsigned char file_name[]="test.txt";
42
int new_file = 0;
43
44
45
ISR(ADC_vect)
46
{
47
  //PORTD ^=(1<<PD7);
48
  adc_result = (double) (ADCL + (ADCH<<8));
49
  next = 1;
50
}
51
52
ISR(USART0_RX_vect)
53
{
54
  number = UDR0;
55
  
56
  switch (number)
57
  {
58
    case 'a':
59
      //select_adc_ch0();
60
      PORTD |= (1<<PD7);
61
    break;
62
    
63
    case 'b':
64
      //select_adc_ch1();
65
      PORTD &= ~(1<<PD7);
66
    break;
67
  }
68
69
}
70
71
72
73
int main(void)
74
{  
75
  
76
  avr_init();
77
  UART_Init();
78
  _delay_ms(500);
79
  
80
  uart_puts("Boot");
81
82
  // Versuch Karte zu Initialisieren, bis es klappt. Umbedingt so, weil die Initialiesierung nicht immer auf anhieb klappt.
83
  while (FALSE == mmc_init()){
84
    nop();
85
  }
86
87
  uart_puts("...");
88
89
90
  // Fat initialisieren. Nur wenn das klappt sind weitere Aktionen sinnvoll, sonst aendet das Programm !
91
  if(TRUE == fat_loadFatData()){
92
93
    uart_puts("Ok");    // Wenn auf dem terminal "Boot... OK" zu lesen ist, ist Init OK. Jetzt kann man schreiben/anhaengen/lesen
94
95
  }
96
  
97
  //SPI_MasterInit();
98
  
99
  VTESC;                      //Senden eines ESC-Zeichens
100
  VTRESET;                    //Reseten der Terminalausgabe
101
  
102
  VTESC;
103
  uart_puts("[02;2H");
104
  Send_UART_Char("Initialisiere Device: ");
105
  VTESC;
106
  uart_puts("[03;5H");
107
  uart_puts("- Initialisiere Register");
108
  VTESC;
109
  uart_puts("[03;30H");
110
  _delay_ms(500);
111
  uart_puts("=> Done!");
112
  
113
  VTESC;
114
  uart_puts("[04;5H");
115
  uart_puts("- Initialisiere ADC");
116
  VTESC;
117
  uart_puts("[04;30H");
118
  _delay_ms(500);
119
  uart_puts("=> Done!");
120
  
121
  VTESC;
122
  uart_puts("[05;5H");
123
  uart_puts("- Initialisiere SPI");
124
  VTESC;
125
  uart_puts("[05;30H");
126
  _delay_ms(500);
127
  uart_puts("=> Done!");
128
  _delay_ms(2500);
129
  
130
  
131
  
132
  VTESC;                      //Senden eines ESC-Zeichens
133
  VTRESET;                    //Reseten der Terminalausgabe
134
  VTESC;                      //Senden eines ESC-Zeichens
135
  VTAUTO;                      //Schalten des Terminals auf VT100
136
  VTESC;                      //Senden eines ESC-Zeichens
137
  VTPosZero;                    //Setzen des Cursors auf die Position 0/0
138
  VTESC;                      //Senden eines ESC-Zeichens
139
  VTCLSbelow;
140
  
141
  sei();
142
    
143
  /*ADCSRA |= (1<<ADSC);*/
144
145
    while(1)
146
    {
147
    vt100();
148
    //select_adc(number);
149
  
150
    counter++;
151
    counter_high = (counter >> 8);
152
    test = counter_high | 0b00110000;
153
    
154
    if (counter == 4090)
155
    {
156
      counter = 256;
157
    }
158
    
159
        MCP4921_setdata(test, counter);
160
    //MCP4921_latchdata();
161
    _delay_ms(50);
162
    
163
    //PORTC ^=(1<<PC0);
164
    
165
166
    if (next == 1)
167
    {
168
169
      ADC_value = calculate_adc(adc_result);
170
      
171
      dtostrf(ADC_value, 5, 3, buffer_adc);
172
      VTESC;
173
      uart_puts("[07;2H");
174
      uart_puts("Read Voltage: ");
175
      uart_puts(buffer_adc);
176
      Send_UART_Char("V ");
177
      next = 0;  
178
    }
179
    
180
    
181
    
182
    
183
    MCP4921_showvoltage(counter);
184
    
185
    if (counter_sd <= 100)
186
    {
187
    // Datei existiert nicht, also anlegen !
188
    if(MMC_FILE_NEW == ffopen(file_name)){
189
      
190
      
191
            ffwrites((unsigned char*)"Read Voltage: ");
192
      ffwrites((unsigned char*)buffer_adc);
193
194
      // Neue Zeile in der Datei
195
      ffwrite(0x0D);
196
      ffwrite(0x0A);
197
198
      // Schließt Datei
199
      ffclose();
200
      new_file = 1;
201
    }
202
    
203
    
204
    //if (ffileExsists(file_name) == TRUE)
205
    //{
206
    //  ffopen(file_name);
207
    //}
208
    
209
    // Datei existiert, also anhaengen !
210
    if(MMC_FILE_EXISTS == ffopen(file_name)){
211
212
      
213
      ffseek(file.length);  
214
215
      ffwrites((unsigned char*)"Read Voltage: ");
216
      ffwrites((unsigned char*)buffer_adc);
217
218
      ffwrite(0x0D);
219
      ffwrite(0x0A);
220
      ffclose();
221
      
222
      PORTC ^=(1<<PC0);
223
    }
224
    
225
    }  
226
    
227
    counter_sd++;  
228
    _delay_ms(100);
229
    
230
    start_converting();
231
    
232
    }
233
}

von Karl H. (kbuchegg)


Lesenswert?

1
unsigned char ffopen( unsigned char name[]){
2
3
  unsigned char file_flag = fat_loadFileDataFromDir(name);  //pruefung ob datei vorhanden. wenn vorhanden, laden der daten auf das file struct.
4
5
  if( file_flag==TRUE ){                    /** datei existiert, anlegen nicht noetig! **/
6
    fat_getFatChainClustersInRow( file.firstCluster );    // verkettete cluster aus der fat-chain suchen.
7
    file.name = name;
8
9
    #if (MMC_MULTI_BLOCK==TRUE && MMC_OVER_WRITE==FALSE)
10
...

wie hast du denn MMC_MULTI_BLOCK bzw. MMC_OVER_WRITE gesetzt?

von Marco G. (grmg2010)


Lesenswert?

Multi_Block ist False und Overwrite ist true

von Marco G. (grmg2010)


Lesenswert?

Ok, ich habe jetzt noch mal MMC_OVERWRITE auf false gesetzt. Nun bekomme 
ich wieder nur eine Datei, wie gewünscht.

von Marco G. (grmg2010)


Lesenswert?

Merkwürdig, jetzt bleibt der Code kurz nach dem Eintritt in die Main 
stehen, nichts geht mehr.

Hier mal der Code:
1
int main(void)
2
{  
3
  avr_init();
4
  UART_Init();
5
  _delay_ms(50);
6
  
7
  uart_puts("Boot");
8
  PORTC ^=(1<<PC1);
9
  
10
  // Versuch Karte zu Initialisieren, bis es klappt. Umbedingt so, weil die Initialiesierung nicht immer auf anhieb klappt.
11
  while (FALSE == mmc_init()){
12
    nop();
13
  }
14
15
  uart_puts("...");
16
17
18
  // Fat initialisieren. Nur wenn das klappt sind weitere Aktionen sinnvoll, sonst aendet das Programm !
19
  if(TRUE == fat_loadFatData()){
20
21
    uart_puts("Ok");    // Wenn auf dem terminal "Boot... OK" zu lesen ist, ist Init OK. Jetzt kann man schreiben/anhaengen/lesen
22
    //PORTD ^=(1<<PD7);
23
24
  }
25
  
26
  
27
  VTESC;                      //Senden eines ESC-Zeichens
28
  VTRESET;                    //Reseten der Terminalausgabe
29
  
30
  VTESC;
31
  uart_puts("[02;2H");
32
  Send_UART_Char("Initialisiere Device: ");
33
  VTESC;
34
  uart_puts("[03;5H");
35
  uart_puts("- Initialisiere Register");
36
  VTESC;
37
  uart_puts("[03;30H");
38
  _delay_ms(500);
39
  uart_puts("=> Done!");
40
  
41
  VTESC;
42
  uart_puts("[04;5H");
43
  uart_puts("- Initialisiere ADC");
44
  VTESC;
45
  uart_puts("[04;30H");
46
  _delay_ms(500);
47
  uart_puts("=> Done!");
48
  
49
  VTESC;
50
  uart_puts("[05;5H");
51
  uart_puts("- Initialisiere SPI");
52
  VTESC;
53
  uart_puts("[05;30H");
54
  _delay_ms(500);
55
  uart_puts("=> Done!");
56
  _delay_ms(2500);
57
  
58
  
59
  
60
  VTESC;                      //Senden eines ESC-Zeichens
61
  VTRESET;                    //Reseten der Terminalausgabe
62
  VTESC;                      //Senden eines ESC-Zeichens
63
  VTAUTO;                      //Schalten des Terminals auf VT100
64
  VTESC;                      //Senden eines ESC-Zeichens
65
  VTPosZero;                    //Setzen des Cursors auf die Position 0/0
66
  VTESC;                      //Senden eines ESC-Zeichens
67
  VTCLSbelow;
68
  
69
  sei();
70
  PORTC &=~(1<<PC1);  
71
  //ffmkdir(file_dir);
72
  //ffcd(file_dir);
73
    
74
  /*ADCSRA |= (1<<ADSC);*/
75
76
    while(1)
77
    {
78
    itoa(counter, buffer1, 10);
79
    VTESC;
80
    uart_puts("[09;2H");    
81
    uart_puts(buffer1);
82
    Send_UART_Char("V ");
83
    
84
    
85
    vt100();
86
    //select_adc(number);
87
  
88
    counter++;
89
    counter_high = (counter >> 8);
90
    test = counter_high | 0b00110000;
91
    
92
    if (counter == 4090)
93
    {
94
      counter = 256;
95
    }
96
    
97
        MCP4921_setdata(test, counter);
98
    //MCP4921_latchdata();
99
    _delay_ms(50);
100
    
101
    //PORTC ^=(1<<PC0);
102
    
103
104
    if (next == 1)
105
    {
106
107
      ADC_value = calculate_adc(adc_result);
108
      
109
      dtostrf(ADC_value, 5, 3, buffer_adc);
110
      VTESC;
111
      uart_puts("[07;2H");
112
      uart_puts("Read Voltage: ");
113
      uart_puts(buffer_adc);
114
      Send_UART_Char("V ");
115
      next = 0;  
116
    }
117
    
118
    
119
    
120
    
121
    MCP4921_showvoltage(counter);
122
    
123
    if (counter_sd <= 100)
124
    {
125
      //ffcd(file_dir);
126
      counter_anzahl++;
127
      itoa(counter_anzahl, buffer3, 10);
128
    // Datei existiert nicht, also anlegen !
129
    if(MMC_FILE_NEW == ffopen(file_name)){
130
      
131
      
132
      // Schreibt String auf Karte ! Nur richtige Strings koennen mit ffwrites geschrieben werden !
133
      ffwrites((unsigned char*)"Read Voltage: ");
134
      ffwrites((unsigned char*)buffer_adc);
135
136
      // Neue Zeile in der Datei
137
      ffwrite(0x0D);
138
      ffwrite(0x0A);
139
140
      // Schließt Datei
141
      ffclose();
142
      new_file = 1;
143
    }
144
    
145
    
146
    // Datei existiert, also anhaengen !
147
    if(MMC_FILE_EXISTS == ffopen(file_name)){
148
149
      
150
      ffseek(file.length);   // Spult bis zum Dateiende vor um anzuhaengen, geht auch ohne Option MMC_OVER_WRITE !
151
      ffwrites((unsigned char*) "Wert Nr: ");
152
      ffwrites((unsigned char*)buffer3);
153
      ffwrites((unsigned char*)" Read Voltage: ");
154
      ffwrites((unsigned char*)buffer_adc);
155
156
      ffwrite(0x0D);
157
      ffwrite(0x0A);
158
      ffclose();
159
      
160
      PORTC ^=(1<<PC0);
161
      }
162
    
163
    }  
164
    
165
    counter_sd++;  
166
    _delay_ms(100);
167
    
168
    start_converting();
169
170
    
171
    }
172
}

von Marco G. (grmg2010)


Lesenswert?

Bei dem Makro MMC_OVERWRITE hätte ich gedacht, dass es das File 
Überschreibt, wenn es vorhanden ist, nicht immer neue mit dem selben 
Namen erzeugt.

Das der µC natürlich geringere Ressourcen hat als ein PC ist mir klar. 
Auch das dadurch einige Operationen nicht funktionieren.

Bei meinem Code war es allerdings so, dass er erst funktioniert hatte. 
Ich hatte dann die Anzahl der Durchläufe zum schreiben erhöht. Danach 
ging nichts mehr. Ich hatte dann zum Testen alle Dateioperationen 
auskommentiert, aber dennoch hat es nicht wieder funktioniert.
Ich denke, ich werde morgen mal den Code komplett neu schreiben (Stück 
für Stück) um zu testen, wo es beginnt zu haken.

Da ich nur eine Datei beschreibe, werde ich das ffclose() nur noch alle 
x Operationen nutzen. Anstelle der Funktion werde ich in der Schleife 
mal die Funktion ffflushData ausprobieren.

von Falk B. (falk)


Lesenswert?

@ Marco G. (grmg2010)

>
>Bei meinem Code war es allerdings so, dass er erst funktioniert hatte.
>Ich hatte dann die Anzahl der Durchläufe zum schreiben erhöht. Danach
>ging nichts mehr.

Was ein klares Anzeichen für einen Fehler ist!

>Da ich nur eine Datei beschreibe, werde ich das ffclose() nur noch alle
>x Operationen nutzen.

FALSCH!

> Anstelle der Funktion werde ich in der Schleife
>mal die Funktion ffflushData ausprobieren.

Auch falsch!

Bei normalen Dateioperationen mit einer Lib, die den Namen FAT-Lib 
verdient, muss man mit flush gar nichts machen, darum kümmert sich die 
LIB! Man schreibt nur mit .._write() schön seine Daten in die Datei und 
am ENDE macht man EINMALIG ein close(). Damit ist der Dateizugriff 
beendet. Alles andere ist Murks!

Ein flush() ist nur in SEHR speziellen Fällen nötig.

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.