Forum: Mikrocontroller und Digitale Elektronik MSP430 ohne Dateisystem: Daten von microSD am PC auslesen?


von Mark M. (mom-jovi)


Lesenswert?

Hallo,

mein Programm schreibt Messdaten vom MSP430F1610 auf eine MicroSD, dabei 
kann ich den physikalischen Sektor angeben, ab dem die Daten 
gespeichert sind. Mit einem Hex-Editor kann ich diese Daten dann 
schließlich auch am PC sehen.
Nun sollen die Daten für einfachere Verarbeitung aber in einer 
Text-Datei zu stehen kommen.

Nach dem Formatieren in FAT schreibe ich eine leere Textdatei auf die 
Karte, deren Inhalt dann - im Hexeditor ersichtlich - beim 
physikalischen Sektor 647 beginnt. Gebe ich dem Programm den Sektor an, 
schreibt es zwar dorthin, in der Datei ist davon aber nichts zu finden.

Hat jemand nen Ansatz, wie ich die Daten in der Datei sichtbar machen 
kann, ohne ein FAT zu implementieren? ich lese überall, dass FAT ohnehin 
zu kompliziert wäre und man es einfach so lösen soll, aber eine Lösung, 
wie man später wieder ran kommt, finde ich nirgendwo.

von Olaf (Gast)


Lesenswert?

Schreibe keine leere Textdatei sondern eine volle.

Olaf

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Textdatei darf nicht leer sein. Lege eine Textdatei an, die 
mindestens so lang ist, wie die von Dir zu beschreibende Sektoranzahl.

FAT ist so kompliziert nicht, und es gibt FAT-Implementierungen wie Sand 
am Meer. Solange Du keine SDHC-Karten verwenden willst (also die Karten 
nicht größer werden als 2 GB), wird FAT16 verwendet, und das kann man 
problemlos auch mit kleineren Controllern verwalten.

von Mark M. (mom-jovi)


Lesenswert?

Olaf schrieb:
> Schreibe keine leere Textdatei sondern eine volle.

Sie müsste voll sein. Ich hab mit "Dummy.exe" ein 2 MB großes File 
geschrieben, und auch schon 2 GB, sodass die ganze Karte voll ist, nur 
kann man das dann nicht mehr im Editor anzeigen.

von Wolfgang-G (Gast)


Lesenswert?

>physikalischen Sektor 647 beginnt. Gebe ich dem Programm den Sektor an,
>schreibt es zwar dorthin, in der Datei ist davon aber nichts zu finden.
schreibt Dein Programm tatsächlich in den Sektor 647?

MfG

von Chris R. (hownottobeseen)


Lesenswert?

Hi,

bist du sicher, dass mit 647 auch 647 und nicht 0x647 gemeint ist?

Wenn du ein richtiges FAT auf der Karte vermeiden willst, kannst du per 
Windows API (CreateFile) physisch auf das Speichermedium zugreifen. 
Suchmaschinenfutter wäre "[Programmiersprache] raw disk access".

Ansonsten: FAT auf µCs ist kein Hexenwerk, man muss es ja nicht 
zwangsläufig selbstentwickeln, sondern kann fertige Implementierungen 
verwenden...

von Mark M. (mom-jovi)


Lesenswert?

Chris R. schrieb:
> bist du sicher, dass mit 647 auch 647 und nicht 0x647 gemeint ist?
>
> Wenn du ein richtiges FAT auf der Karte vermeiden willst, kannst du per
> Windows API (CreateFile) physisch auf das Speichermedium zugreifen.
> Suchmaschinenfutter wäre "[Programmiersprache] raw disk access".

"Raw disk acces" scheint mir, sich auf die Implementierung auf dem µC zu 
beziehen, oder verstehe ich das falsch?
Die Implementierung ist aber bereits fertig, ich kann auf einen 
bestimmten physikalischen Sektor schreiben.
Das Problem ist jetzt nur, dass der Benutzer ohne Hex-Editor nicht an 
die Daten rankommt, weil man eine Datei in Windows ja nicht ohne 
weiteres bei einem bestimmten Sektor anfangen lassen kann.

von ingo (Gast)


Lesenswert?

> Das Problem ist jetzt nur, dass der Benutzer ohne Hex-Editor nicht an
> die Daten rankommt, weil man eine Datei in Windows ja nicht ohne
> weiteres bei einem bestimmten Sektor anfangen lassen kann.

Die angeschlossenen Plattenlaufwerke (und dazu zählen auch SD-Karten) 
sind unter Windows (mit Admin-Rechten) unter
\\.\PhysicalDrive0
\\.\PhysicalDrive1 usw zu erreichen.

Um gezielt einzelne Sektoren ober Bereiche daraus, in eine Datei zu 
kopieren, bietet sich das Programm "dd" an:

http://de.wikipedia.org/wiki/Dd_%28Unix%29

Dort ist auch eine Windows-Version zu finden.
mfG ingo

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mark M. schrieb:
> Die Implementierung ist aber bereits fertig, ich kann auf einen
> bestimmten physikalischen Sektor schreiben.
> Das Problem ist jetzt nur, dass der Benutzer ohne Hex-Editor nicht an
> die Daten rankommt, weil man eine Datei in Windows ja nicht ohne
> weiteres bei einem bestimmten Sektor anfangen lassen kann.

Jetzt weißt Du, warum diese Designentscheidung Pfusch war. Den kann man 
zwar programmatisch umgehen (wie Ingo beschreibt), aber das hat wiederum 
Einschränkungen. Einerseits, weil der Zugriff nur mit zusätzlicher 
Software möglich ist, und andererseits, weil der Zugriff auch noch 
Administratorrechte erfordert.

Mark M. schrieb:
> Das Problem ist jetzt nur, dass der Benutzer ohne Hex-Editor nicht an
> die Daten rankommt, weil man eine Datei in Windows ja nicht ohne
> weiteres bei einem bestimmten Sektor anfangen lassen kann.

Das Problem kannst Du auf zweieinhalb Arten umgehen:

a) Du legst mit einem PC eine Datei definierter Größe auf der Karte an 
und findest heraus, welche Sektoren sie belegt, und verwendest diese 
Sektornummern als Konstanten in Deinem Programm

b) Du springst über Deinen Schatten und implementierst eine einfache 
FAT-Unterstützung. Wenn Du auf Unterverzeichnisse verzichtest und 
Dateien nur mit 8.3-Stummelnamen im Root ablegst, dann ist das nicht so 
irrwitzig viel Programmieraufwand.

c) (bzw. b/2) Du kannst einen Hybrid aus a) und b) machen - Du legst mit 
dem PC eine Datei auf der Karte an, und liest mit dem µC das (Root-) 
Verzeichnis und die FAT aus. Im Verzeichnis-Eintrag der Datei steht der 
erste genutzte Cluster, und über die FAT kannst Du die Clusternummern 
der weiteren Cluster der Datei bestimmen, sofern sie überhaupt größer 
ist als ein Cluster.
Diese Datei kannst Du, sofern ihre Größe ausreicht, munter sektorweise 
überschreiben, und der Nutzer kann sie am PC (oder auch anderen Geräten) 
ohne Zusatzsoftware lesen.

Natürlich ist b) zu bevorzugen, weil natürlich der Fall eintreten kann, 
daß eine SD-Karte ohne die Spezialdatei eingeschoben wird, oder diese 
versehentlich vom PC gelöscht oder überschrieben wird.

von Mark M. (mom-jovi)


Lesenswert?

Rufus Τ. Firefly schrieb:
> a) Du legst mit einem PC eine Datei definierter Größe auf der Karte an
> und findest heraus, welche Sektoren sie belegt, und verwendest diese
> Sektornummern als Konstanten in Deinem Programm

Das hatte ich vor, funktioniert aber nicht. In der Datei steht danach 
auch nichts drin.

von Mark M. (mom-jovi)


Lesenswert?

Ich hab mittlerweile eine FAT implementiert, die man bei Google unter 
"sham176" findet. Das funktioniert auch soweit, nachdem ich das HAL 
modifiziert habe. Allerdings fehlen einige Funktionen, wie z.B. Dateien 
löschen oder in schon bestehende Dateien schreiben...
Kann mir da jemand weiterhelfen?

von Wolfgang-G (Gast)


Lesenswert?

>Das hatte ich vor, funktioniert aber nicht. In der Datei steht danach
>auch nichts drin.
Normalerweise funktioniert das.
Schreib doch einfach mal einige Zeichen in den Sektor 647 und suche 
anschließend die Zeichenfolge auf der GESAMTEN Karte.
Damit kannst Du erkennen, ob und wohin Du tatsächlich geschrieben hast.
MfG

von Mark M. (mom-jovi)


Lesenswert?

Wolfgang-G schrieb:
> Normalerweise funktioniert das.
> Schreib doch einfach mal einige Zeichen in den Sektor 647 und suche
> anschließend die Zeichenfolge auf der GESAMTEN Karte.
> Damit kannst Du erkennen, ob und wohin Du tatsächlich geschrieben hast.
> MfG

Hab ich gemacht. In der Datei im Explorer steht trotzdem nichts.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dann ist Deine Interpretation, daß der Sektor 647 zur Datei gehört, 
falsch.

Schreib mit dem PC was in die Datei, und such das mal auf der Karte.

von Wolfgang-G (Gast)


Lesenswert?

>Hab ich gemacht. In der Datei im Explorer steht trotzdem nichts.
Entweder wurde gar nichts geschrieben oder es steht irgendwo auf der 
Karte.
Es gibt bestimmt verschiedene Programme, mit denen man sich die gesamte 
Karte "physisch" ansehen kann. Bei mir hat sich WINHEX bewährt.
Mit diesem Programm kann man sich z.B. eine Zeichenfolge suchen lassen 
und sieht genau, wo die Zeichen gelandet sind.
MfG

von holger (Gast)


Lesenswert?

>Hab ich gemacht. In der Datei im Explorer steht trotzdem nichts.

Wenn deine Karte eine Partitionstabelle hat ist die Sektornummer
nicht richtig. Sektor 647 ist dann ein logischer Sektor ab
dem Bootsektoroffset. Den Bootsektoroffset musst du dann
zu 647 addieren.

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.