Forum: Mikrocontroller und Digitale Elektronik SD Card mit Atmega beschrieben (FAT32) - Datei nicht lesbar in Windows


von Timo .. (waswasi)


Lesenswert?

Hallo,

wie der Thread-Name schon sagt, habe ich mit den FAT32 Sourcen von 
Daniel R. (http://www.mikrocontroller.net/articles/AVR_FAT32) eine 
SD-Card beschrieben, mit einem Atmega1284P.

Ich kann die Datei über den Atmega problemlos weiterschreiben und auch 
über den Atmega wieder einlesen. Wenn ich die SD-Card nun aber in meinen 
Laptop stecke, kann ich die Datei nicht mehr lesen!

Windows meldet "Die Datei oder das Verzeichnis /mem.txt ist beschädigt 
und nicht lesbar". Hat es irgendetwas mit Byteorder (Little Endian/Big 
Endian??) oder sowas zu tun? Ich habe auch die FAT schon mit dem 
Programm TestDisk überprüft, und da scheint alles in Ordnung zu sein.

Falls es irgendwie relevant ist, ich habe folgendes in die Datei 
geschrieben:

"test012;3632419318;000050000;000155;05\r\n
test234;3632419553;000000020;000010;05\r\n
test567;3632419391;000045000;000120;00\r\n"


Hat jemand eine Ahnung was da schief gelaufen ist?


Wäre für Hilfe sehr dankbar.

Grüße

von Peter II (Gast)


Lesenswert?

Timo .x schrieb:
> Hat jemand eine Ahnung was da schief gelaufen ist?

kann du den SD-CARD mal RAW auslesen ( Linux mit dd oder irgendeinem 
Windows tool)

Dann kann man die FAT überprüfen, wo das Problem liegt.

von Timo .. (waswasi)


Lesenswert?

Hört sich gut an. Ich google mal eben, ob ich ein passendes Windows-Tool 
auftreiben kann (oder kennst Du bereits eins?).

von Falk B. (falk)


Lesenswert?

@ Timo .x (waswasi)

>Ich kann die Datei über den Atmega problemlos weiterschreiben und auch
>über den Atmega wieder einlesen.

Wo ist dein Programm dazu?

>Windows meldet "Die Datei oder das Verzeichnis /mem.txt ist beschädigt
>und nicht lesbar". Hat es irgendetwas mit Byteorder (Little Endian/Big
>Endian??)

Nein.

> oder sowas zu tun?

Ja.

Vielleicht wird die Datei nicht korrekt geschlossen und es sind noch 
gepufferte Daten im Mirkocontroller, welche nicht korrekt auf die 
SD-Karte geschrieben werden.

von Timo .. (waswasi)


Angehängte Dateien:

Lesenswert?

Also wie gesagt ich verwende die Routinen von Daniel R., also einfach:

ffwrites("test123");
ffwrite(';');
ffclose();


usw. In der Operatin ffclose() wird der gepufferte Bereich auf die 
SD-Card geschrieben. Ich hänge die Original-Source mal an.


Außerdem habe ich jetzt mit TestDisk ein Image von der SD-Card 
abgezogen,
namens image.dd. Ist das die RAW Version die angesprochen wurde? Ich 
würde es gerne anhängen, es ist aber 2GB groß :)

von Peter II (Gast)


Lesenswert?

Timo .x schrieb:
> Außerdem habe ich jetzt mit TestDisk ein Image von der SD-Card
> abgezogen,
> namens image.dd. Ist das die RAW Version die angesprochen wurde? Ich
> würde es gerne anhängen, es ist aber 2GB groß :)

die 1MB müsste reichen.

von Peter II (Gast)


Lesenswert?

Peter II schrieb:
> die 1MB müsste reichen.

die ersten 1-2MB müsste reichen.

von Falk B. (falk)


Lesenswert?

@ Timo .x (waswasi)

>    file.c (32,9 KB, 0 Downloads) | Codeansicht


>Also wie gesagt ich verwende die Routinen von Daniel R., also einfach:

>ffwrites("test123");
>ffwrite(';');
>ffclose();

Willst du mich veralbern? Poste deinen ORIGINALquelltext als Angang, 
auch von deinem Testprogramm!

>usw. In der Operatin ffclose() wird der gepufferte Bereich auf die
>SD-Card geschrieben. Ich hänge die Original-Source mal an.

Das ist der nur Quelltext der Lib, nicht dein Programm!

>Außerdem habe ich jetzt mit TestDisk ein Image von der SD-Card
>abgezogen,
>namens image.dd. Ist das die RAW Version die angesprochen wurde? Ich
>würde es gerne anhängen, es ist aber 2GB groß :)

Nein danke.

Es reicht, mit einem gescheiten Hex-Editor ala WinHex die FAT und die 
Verzeichniseinträge anzusehen, das reicht schon.

von Timo .. (waswasi)


Lesenswert?

Ok. Kannst Du mir auf die Sprünge helfen wie ich die Datei verkleinern 
kann? in einem Hex-Editor krieg ich das nicht geladen.

von Falk B. (falk)


Lesenswert?

Winhex greift direkt auf die SD-Karte zu, da muss man kein Image 
erzeugen.

von Timo .. (waswasi)


Lesenswert?

Ok mit WinHex kann ich es laden. Gib mir kurz Zeit, ich erstelle die 2 
MB.


Zu meinem Original-Code. Den zu posten ist nicht so einfach da er über 
verschiedene Stellen verteilt ist. Ich rufe es in einer Telnet-Session 
auf mit User Interaktion. Es läuft uIp als Ethernet-Stack. Kann es also 
nicht ohne weiteres runter copy/pasten.

von Timo .. (waswasi)


Angehängte Dateien:

Lesenswert?

So, das sind die ersten 100 KB oder so, danach kommen nur noch 00 er.

Könnt ihr mit dem Format so was anfangen oder soll ich es anders 
formatieren?

von Timo .. (waswasi)


Lesenswert?

Falls die Information was nützt, wenn ich mit WinHex direkt die mem.txt 
öffnen möchte stürzt auch dieser Editor mit einer Fehlermeldung ab :(.

Kann man denn an dem Image irgendetwas sehen?

von selbesProb (Gast)


Lesenswert?

Hey, ich habe das selbe(?) Problem.

Nachdem ich mmc_init()und fat_loadFatData() aufgerufen habe, und das 
Programm beende funktionert meine SD-Karte noch, wenn ich diese an dem 
PC anschauen.

Sobald ich versuche, eine Datei zu öffnen mit(die if-Abfrage wird 
abgearbeitet, also wird doch eine Datei angelegt?!):
1
DISABLE_INTERRUPTS;
2
if (ffopen(fname, 'c') == MMC_FILE_CREATED) 
3
{
4
 ffwrites((uint8_t*) "abc");
5
 ffwrite(0x0D);
6
}
7
ffclose();
8
ENABLE_INTERRUPTS;

und dann versuche, die Datei auf dem PC anzuschauen, kann die SD-Karte 
nicht mehr gelesen werden.

Weiß einer, wo das Problem liegen könnte?
1
while (1) {
2
if ((GPIOD_PDIR & (1 << 1)) == 0) {  // Wenn taster gedrückt wird
3
      green_on();
4
      SDCard_init();
5
      SDCard_write();
6
  //    SDCard_read();
7
      green_off();
8
    }
9
 }
10
11
void SDCard_init() {
12
  if (!mmc_initialized) {
13
    if (MMC_PI) {  //SD-Karte vorhanden?
14
      spi_slow();
15
      delay(1);
16
      if (mmc_init()) {
17
        if (fat_loadFatData()) {
18
          mmc_initialized = true;
19
          spi_fast();
20
         yellow_on();
21
          delay(1);
22
        }
23
      }
24
      spi_fast();
25
      delay(1);
26
    } else {
27
      delay(100);
28
    }
29
  }
30
}
31
32
void SDCard_write() {
33
  if (mmc_initialized) {
34
35
    uint8_t i;
36
37
    DISABLE_INTERRUPTS;
38
    if (ffopen(fname, 'c') == MMC_FILE_CREATED) 
39
{
40
      ffwrites((uint8_t*) "abc");
41
42
    }
43
44
    ffclose();
45
    ENABLE_INTERRUPTS;
46
  }
47
}

von Jim M. (turboj)


Lesenswert?

Timo .. schrieb:
> So, das sind die ersten 100 KB oder so, danach kommen nur noch 00 er.

Ganz sicher? Bei mir sind SDHC Karten so formatiert, das die FATs an 
Page Grenzen ausgerichtet sind. Das bedeutet das die FAT (also die 
Allokierungsinfos) erst ab 4 MB oder 8 MB anfängt. Die Daten kommen 
noch viel später...

Erschwerend kommt bei Dir hinzu, dass das nur der Anfang der Partition 
aber nicht die komplette "Disk" ist. SD Karten haben praktisch immer 
eine Partitionstabelle - die sieht WinHex aber nur wenn man als Admin 
den korrekten physischen Datenträger geöffnet hat.

Das Posten von hex Daten ohne Zeilenumbrüche ist für Analysezwecke 
ungeeignet. Mit dem bloßen Auge erkenne ich nicht die Anfänge der Bytes,
und für Tools müsste ich irgendwie wieder nach Binär kovertieren. Was 
ich mir geschenkt habe, da ich keine Daten als FAT Einträge erkennen 
kann.

von Stefan F. (Gast)


Lesenswert?

Boote doch einfach eine Ubuntu Linux CD, dann kannst du die Karte mit 
dem dd Befehl auslesen.

Außerdem gibt der Kernel in seinem Log (dmesg Befehl) in der Regel recht 
detaillierte Fehlermeldungen aus, wenn es zu Lesefehlern kommt.

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.