www.mikrocontroller.net

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


Autor: Thomas Hermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Hermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn G. aus H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Hermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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=...

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!

Autor: Christoph Kessler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Hermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Hermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Hermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Hermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Hermann (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Hermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander Starke (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Alexander Starke (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alexander Starke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander Starke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hex Editoren dafür gibt es genug:

http://www.google.de/search?hl=de&q=hex+editor+fre...

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

Autor: Alexander Starke (Gast)
Datum:

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

Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Fly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mikro Avr (mikroavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abo

Autor: Alexander Starke (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.