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
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.
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.
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.
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
Hi und für die Puristen und Automatiesierer: dd für Windows -> http://uranus.it.swin.edu.au/~jn/linux/rawwrite/dd.htm Matthias
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
@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!
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.
@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.
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
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.
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.
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.
Die Testversion vom WinHex macht immerhin etwa 750kByte/s, wer weiß, welchen Ansatz die genommen haben.
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.
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.
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
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 ?
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
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?
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.
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.
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.
Bei mir funktionieren deine Eingaben - sicher, dass du nicht Start- und Endwert vertauscht hattest? Das würde das Verhalten erklären.
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!
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.