www.mikrocontroller.net

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


Autor: Mark M. (mom-jovi)
Datum:

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

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibe keine leere Textdatei sondern eine volle.

Olaf

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

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

Autor: Mark M. (mom-jovi)
Datum:

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

Autor: Wolfgang-G (Gast)
Datum:

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

Autor: Chris R. (hownottobeseen)
Datum:

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

Autor: Mark M. (mom-jovi)
Datum:

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

Autor: ingo (Gast)
Datum:

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

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

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

Autor: Mark M. (mom-jovi)
Datum:

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

Autor: Mark M. (mom-jovi)
Datum:

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

Autor: Wolfgang-G (Gast)
Datum:

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

Autor: Mark M. (mom-jovi)
Datum:

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

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

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

Autor: Wolfgang-G (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

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.