Forum: Mikrocontroller und Digitale Elektronik Speicherkarte ohne Dateisystem Auslesen (Windows)


von Thomas Hermann (Gast)


Lesenswert?

Hallo,

eigentlich sagt der Betreff ja schon alles, es gilt, eine MMC bzw.
SD-Karte am PC auszulesen. Ein Mikrocontroller hat sie zuvor mit einem
Haufen Rohdaten beschrieben. Da das Auslesen über den Mikrocontroller
über RS232 ziemlich langwierig ist, wäre es gut, wenn jemand ein
Programm kennen würde, was mir die Rohdaten einfach in eine Textdatei
auf dem PC schreibt (Auslesen via Card-Reader).

Es gibt ja diverse Datenrettungsprogramme, die im Hintergrund
eigentlich auch nichts anderes machen, allerdings stellen die einem die
Rohdaten nicht zu Verfügung.

Danke,
Thomas

von Fly (Gast)


Lesenswert?

http://www.mirkes.de/en/freeware/tinyhex.php
wäre ein gratis Kandidat.

Auch gute Erfahrung habe ich mit winhex gemacht.

Generell musst du nach "Hexeditoren" suchen.

von Thomas Hermann (Gast)


Lesenswert?

Danke für den Tipp, das sieht ja schonmal vielversprechend aus. Ich
hoffe nur, dass die Applikation nicht abschmiert, wenn ich ihr eine
4GByte SD-Karte vorsetze.

Ansonsten muss ich halt die Option nutzen, und immer nur einen Teil der
Sektoren auslesen. Auf jeden Fall ist das Tool schon mal mehr als ein
Anfang.

von Fly (Gast)


Lesenswert?

Da würde ich mit dem tiny hexer aufpassen, ich glaube der liest am
Anfang die gsesamte Karte ein bevor man manipulieren kann und das würde
mit so einer grossen Karte ewigs dauern. Ich empfehle dir eine kleine
SD-Karte oder winhex.

von Jörn G. aus H. (Gast)


Lesenswert?

Winhex liest auch ohne Probleme 20GB.
Und hat die pratischen direktzugriff-Funktionen mit Schablonen für
Dateisystem, FAT usw.
Unbedingt zu empfehlen für so etwas!
jörn

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

und für die Puristen und Automatiesierer:
dd für Windows ->
http://uranus.it.swin.edu.au/~jn/linux/rawwrite/dd.htm

Matthias

von Thomas Hermann (Gast)


Lesenswert?

Auf Winhex war ich während des Googelns auch schon gestoßen.

Das von Matthias genannte Tool hätte mir genützt, wenn es nicht in
Pascal (oder auch Delphi?!) geschrieben wäre. Wäre natürlich praktisch
gewesen, die Karte gleich irgendwie mit den MFC auslesen zu können, da
die spätere Auswertung soundso mittels einer C++-Applikation erfolgt.

Trotzdem danke für die vielen Tipps,

Thomas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

@Thomas:
Du kannst mit selbstgeschriebenen Win32-Applikationen die Speicherkarte
als sog. Raw-Device ansprechen; das geht, wie in der Dokumentation von
CreateFile im Abschnitt "Physical Disks and Volumes" angegeben:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/createfile.asp

Der Filepointer, den CreateFile zurückgibt, kannst Du -im Prinzip-
genauso behandeln, wie einen Filepointer, der auf eine Datei mit der
Größe der Speicherkarte verweist.

Ich habe auf die Art und Weise mal einen Dump einer SmartMedia-Karte
angefertigt, um einige durch einen besonders miesen Kartenleser
gelöschte Urlaubsbilder wiederherstellen zu können.

Viel Erfolg!

von Christoph Kessler (Gast)


Lesenswert?

ich hätte jetzt auch den Linux-Dateikopierer "dd" genommen, der ist
auch bei Knoppix mitgeliefert.
dd if=/dev/sda of=Dateiname
mit inputfile "if" die hoffentlich automatisch erkannte SD-Karte -
gleich beim Booten schauen, was Knoppix so schreibt - und outputfile
"of" den Dateinamen im PC, die Datei läßt sich dann mit einem
Hexeditor anschauen. Wenn kein Pfad angegeben wird steht sie im
home-Verzeichnis des Benutzers, dann muß man es noch in ein
Windows-zugängliches Verzeichnis kopieren, irgendeine FAT-Partition
wenn vorhanden.

von Thomas Hermann (Gast)


Lesenswert?

@Rufus

Besten Dank für den Tipp. Wenn ich so alles unter einen Hut bekomme
wird es natürlich optimal.

Natürlich auch danke an den Rest der Helfer und Ideengeber.

von Thomas Hermann (Gast)


Lesenswert?

OK, habe mich mal an einer Implementierung versucht:

hDevice = CreateFile(path,      // drive to open
                    0,                // no access to the drive
                    FILE_SHARE_READ,  // share mode
                    NULL,             // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL);            // do not copy file attributes

Das klappt soweit ohne Probleme sowohl mit USB-Stick als auch
angeschlossener Digi-Cam.

DWORD dwPtr = SetFilePointer(hDevice,  //handle to drive
                     (0*512),  //start sector
                 NULL,    //
               FILE_BEGIN);  //method

Hier stimmt auch noch alles, die Routine soll halt den Pointer auf
Speicherzelle 0 des ausgewählten Gerätes setzen.

if (!ReadFile(hDevice, buffer, 512*numberofsectors, &bytesread, NULL))
{
  DWORD dwError = GetLastError();
      ...
}

Hier hängt es jetzt immer. Ich bekomme Fehlercode 0x05 zurück, was
soviel heißt, wie "access denied". Die gelesenen Bytes bleiben gleich
Null. Die Anzahl der Sektoren ist als Integer erstmal auf Null gesetzt.
Warum nun das? Ich arbeite an diesem Rechner als Admin, daran sollte es
also nicht liegen. Habe ich bei irgendeinem Flag einen Bock gebaut?

Thomas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Auf SetFilePointer kannst Du getrost verzichten, der ist nach CreateFile
eh' auf den Anfang der Datei gesetzt.

Der zweite Parameter von CreateFile sollte allerdings nicht 0 sein,
GENERIC_READ dürfte sinnvollere Ergebnisse liefern.

Weiterhin viel Erfolg.

von Thomas Hermann (Gast)


Lesenswert?

Danke Rufus, mit dieser Veränderung klappt es. Werde die Applikation
bestimmt nach ein bischen Feinschliff in die Codesammlung als
Beispiellösung stellen, mit MMCs bzw. SD-Karten arbeiten hier ja
einige.

Bin mal gespannt, ob die Datenrate mit der des Windows-Explorers
vergleichbar ist.

Den SetFilePointer hatte ich nur verwendet, da ich ihn später soundso
brauche.

von Thomas Hermann (Gast)


Lesenswert?

Tja, irgendwie sind mehr als 150-160kByte/s auf diesem Wege nicht drin.
Mal schauen, vielleicht setze ich das morgen nochmal in nen getrennten
Thread, wenn es hilft. Allerdings ist die CPU-Auslastung während des
Lesens eher gering.

von Thomas Hermann (Gast)


Lesenswert?

Die Testversion vom WinHex macht immerhin etwa 750kByte/s, wer weiß,
welchen Ansatz die genommen haben.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wieviele Sektoren pro Lesezugriff liest Du denn? Einzelsektorzugriffe à
512 Bytes oder größere Blöcke?
Was machst Du mit den so gewonnenen Daten?

Du könntest die Karte auch als Memory Mapped File ansprechen, dann ist
der windows-eigene Cache-Manager für die Zugriffe zuständig, was sich
möglicherweise positiv auf die Performance auswirkt. Ab etwa 1 GByte
Größe musst Du dann allerdings mit einer Art "Speicherfenster"
arbeiten, was die Sache dann etwas verkompliziert.

von Thomas Hermann (Gast)


Lesenswert?

Nochmal danke, wenn man 100 Sektoren auf einmal liest kann man sogar die
Datenrate von WinHex toppen. Hatte mich nur gestern davor gescheut, da
ich als Anzahl der Bytes mal aus Versehen einen Wert gewählt hatte, der
kein Vielfaches von 512 ist - das geht vor den Baum.

Aktuell lese ich die Daten einfach häppchenweise (z.B. in 50kByte
Blöcken) und schreibe sie dann gleich in eine Datei. Mit der
Performance werde ich so leben können, sie liegt nun schon wesentlich
über der Kommunikationsgeschwindigkeit mit dem DSP.

von Alexander Starke (Gast)


Angehängte Dateien:

Lesenswert?

Habe den Thread mit Interesse verfolgt und mal eine Applikation mit dem
Visual-Studio geschrieben. Er hat mir auf jeden Fall eine Menge
Stolperfallen erspart :-)

Habe die App zum selbst kompilieren mal angehangen, falls noch jemand
Verbesserungsvorschläge hat, würde ich mich freuen.

Das Auslesen erfolgt in einem separaten Thread, damit das Fenster bei
längerem Auslesen nicht hängt.

Man kann entweder komplette Karten (bzw. größere Teile) auslesen, dann
werden viele Sektoren auf einmal ausgelesen, was die Sache
beschleunigt. Alternativ kann man einzelne Sektoren auslesen, dies
passiert im Moment sektorweise und deshalb langsam, ich benötige es bei
mir eigentlich nicht.

Die Karte muss als Laufwerksbuchstabe ausgewählt werden, dann muss man
noch einen Pfad und Namen für die Zieldatei angeben.

Die Sache funktioniert auch mit USB-Sticks.


Alex

von Benedikt (Gast)


Lesenswert?

Könntest du das ganze mal kompilieren ?
Mit VC++ 6.0 kann man das ganze nicht so richtig öffnen.

Wie bekommt man eigentlich die Anzahl an Sektoren eines Laufwerks ?

von Alexander Starke (Gast)


Angehängte Dateien:

Lesenswert?

Die Anzahl habe ich einfach durch dividieren bestimmt.

Dabei gehe ich davon aus, dass ein Sektor 512Byte umfasst. Wenn ich die
Datenträgergröße kenne kann ich daraus die Anzahl der Sektoren
bestimmen.

Die *.exe habe ich angehangen.

Habe die App mit VC++.NET 2003 erstellt.

Alex

von Fly (Gast)


Lesenswert?

Interessantes Programm!

Funktioniert bei mir leider mit einer 16MB SD nicht. Das test.dat file
ist absolut leer nach dem lesen des Sektors 32 :(

Machst du auch noch eine Schreibfunktion?

von Alexander Starke (Gast)


Lesenswert?

Was hast du für Optionen gewählt?

Sinnvoll wären:

"Copy Sectors"
Start Sector: 0
End Sector: 100

Das sollte die ersten 100 Sektoren lesen und eine Datei von 512*100Byte
Größe erzeugen.

Eine Schreibfunktion ist nicht geplant, sollte aber mittels
WriteFile(...) kein Problem darstellen.

von Fly (Gast)


Lesenswert?

Jetz hats geklappt, allerdings sehe ich mit dem win edtior nur
chinesisch, mitwas soll ichs öffnen?

Ich probierte

"Copy Sectors"
Start Sector: 32
End Sector: 33

funktionierte nicht.

von Alexander Starke (Gast)


Lesenswert?

Hex Editoren dafür gibt es genug:

http://www.google.de/search?hl=de&q=hex+editor+freeware&btnG=Google-Suche&meta=

Deine Beschreibung klingt nach Bug im Programm, ich schaue es mir
morgen mal an.

von Alexander Starke (Gast)


Lesenswert?

Bei mir funktionieren deine Eingaben - sicher, dass du nicht Start- und
Endwert vertauscht hattest? Das würde das Verhalten erklären.

von Fly (Gast)


Lesenswert?

Logisch, jetz hab ichs getscheggt, du kopierst also alles ab Sektor 0
inkl. den Dateisysteminfos und was da dazu gehört (kenn mich da gar net
aus).

Schönes Tool bis auf den evtl. Bug!

von Fly (Gast)


Lesenswert?

Kein Bug, sondern meine Unwissenheit!

Da der windoof editor nix anzeigte hab ichs mit winhex nicht probiert.
Mit winhex gehts aber, dein Proggi funktioniert einwandfrei!

von Rolf (Gast)


Lesenswert?

Unter MS-Win9X funktionieren die oben beschreibenen Sachen wohl nicht,
aber da gibt's die Möglichkeit einfach ein Dateisystem auf die Karte
zu packen und mit einer Datei komplett zu füllen, an deren Anfang eine
Kennung steht. Hinter dieser Kennung kann der MC dann die Daten ablegen
und auch unter MS-Win9x kann man die Daten auslesen.

von Mikro A. (mikroavr)


Lesenswert?

abo

von Alexander Starke (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Ganze nochmal mit C# realisiert.

Die Programmierumgebung ist bei MS gratis erhältlich. Das Abfangen von
Fehlern ist aktuell nicht in wesentlichem Umfang implementiert, ist
meine erste App mit C#.

Alex

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.