Forum: Mikrocontroller und Digitale Elektronik SD-Karte Sektorweise beschreiben


von Hermann (Gast)


Lesenswert?

Hallo ,
Ich habe Daten Zeilenweise in einer normalen .txt Datei nun möchte ich 
jede Zeile dieser .txt Datei in einen eigenen Sektor der SD-Karte 
schreiben (ein Sektor 512 Byte) .
Gibt es dafür ein Tool ? Denn jede zeile von Hand mittels Hex-Editor in 
einen eigene Sktor zu kopieren ist sehr umständlich.
Liebe Grüße
Hermann

von MagIO (Gast)


Lesenswert?

Ich nehme mal an hier kommt keine Antwort, weil die Fragestellung bei 
jedem der sie liest und nicht Gedanken lesen kann erst mal 1000 
Gegenfragen aufwirft!

Auf welchem System wurde die Textdatei erstellt? PC oder uC? Befinded 
sich die Text-Datei auch schon auf der SD-Karte?
Auf welchem System willst Du die Sektoren erstellen? PC? Win? Linux? uC?
Wie bestimmst Du die Sektoren? Sollen die innerhalb einer Datei liegen? 
Muss FAT heile gelassen werden - sprich soll die SD-Karte anschließend 
noch von einem PC lesbar sein?

In Linux dürfte das ganze am einfachsten gehen. Ein wenig XARGS, AWK, DD 
und schon ist die Text-Datei auf Sektoren verteilt aber FAT kaputt ;o)

PC - Einfach ein Programm schreiben, das dir aus der Txt-Datei eine 
*.DAT oder *.RAW oder wie Du sie auch nennen willst erzeugt. Lese Zeile, 
schreibe Zeile + (512-Zeilenlänge). Dateien fangen immer bündig mit 
einem Sektor an. Das heißt durch das auffüllen landet jede Zeile in 
einem eigenen Sektor wenn man die Datei dann auf die SD kopiert. Wenn 
die SD-Karte leer ist (frisch formatiert), dann sind die Sektoren auch 
aufsteigend. Vorteil: die FAT bleibt ganz.

uC - jegliche Lib zum Zugriff auf eine SD-Karte sollte auch einen 
low-level-Part haben, der auf Sektoren zugreift.

von Hermann (Gast)


Lesenswert?

auf dem PC(Win7) wird die textdatei erstellt .
Nein die Textdatei befindet sich nicht auf der sd karte .
Die Sektoren sind auf dem PC erstellt und FAT muss nicht heil bleiben da 
die Sektoren nurmehr vom µC ausgelesen werden müssen .
Ich will nur vom PC(Win7) direkt auf die SD Karte (ohne FAT) zeile für 
zeile dieser Textdatei in einen eigenen Sektor kopieren ,ohne es von 
hand zB mit einem hexeditor machen zu müssen.
Das ganze dient dazu das ich mit dem µC dann diese daten Sektorweise 
auslesen kann.

von Thomas B. (escamoteur)


Lesenswert?

Wieso nimmst Du nicht einfach die FAT Bibliothek von Elm Chan auf dem 
µC, dann hast Du damit gar kein Problem? Alternativ schreib doch die 
Daten mit dem µC(über RS232 vom PC) auf die SD-Karte.

Gruß
Thomas

von asdf (Gast)


Lesenswert?

Hermann schrieb:
> ohne es von
> hand zB mit einem hexeditor machen zu müssen.
Warum nicht von Hand? Wie viele tausend SD-Karten möchtest du denn 
beschreiben?

Ich würde es so machen:
1. Zeilen auffüllen (mit einem Script in der Sprache deiner Wahl)
2. mit HxD auf die SD Karte kopieren

von Hermann (Gast)


Lesenswert?

asdf schrieb:
> Warum nicht von Hand? Wie viele tausend SD-Karten möchtest du denn
> beschreiben?

Meine 2 GB Sd karte hat tausende 512 Byte Sektoren und das Textfile auch 
bis zu zweitausend von dem her ist das etwas mühselig ^^

aber ich werds mal mit Python probieren,ein Script zu schreiben, auch 
wenn ich bis jetzt noch 0 ahnung davon habe .
Ich hatte nur gehofft das soetwas in der Art schon wer gemacht hat somit 
würde ich mir einen beträchtlich Aufwand ersparen um eine Script Sprache 
zu lernen .
Aber trotzdem danke das mit den Zeilen auffüllen ist garkeine so 
schlechte Idee .

von MagIO (Gast)


Lesenswert?

Was ist der Grund dafür einen Sektor pro Zeile zu verwenden? Wie lang 
sind denn die Zeilen?

von Oliver R. (superberti)


Lesenswert?

Ich hab' mal so was Ähnliches mit "dd" für Windows gemacht. Kopiert was 
auch immer mit beliebigem Offset auf die Karte. Braucht 
Admin(elevated!)-Rechte.

Gruß,

Oliver

von Hermann (Gast)


Lesenswert?

Der Grund ist das auf der SD karte genug Sektoren sind und ich mir mit 
dem µC leicht beim auslesen/filtern der zeilen tue .
Etwa 50 Zeichen pro Zeile sind sie lang.

Einen dd Befehl einfach in eine cmd befehlszeile? Funktioniert das?

Danke für die Antworten (:
Lg

von Oliver R. (superberti)


Lesenswert?

Das funktioniert sogar einwandfrei. Schreibe Deine Daten in eine Datei 
und kopiere die dann mit "dd" auf die Karte. Ich habe mal für einen 
Sound-Geocache ein Programm geschrieben, welches auf diese Art und Weise 
ein primitives Dateisystem für einen einfachen MC auf der SD-Karte 
anlegt.
Für FAT war der MC viel zu schwach, mit meinem ollen Dateisystem hat es 
trotzdem gut geklappt.
Du solltest darauf achten immer "dd --filter=removable ..." zu 
verwenden, um Dir nicht Deine Platten zu schrotten ;-)

Gruß,

Oliver

von Hermann (Gast)


Lesenswert?

Okay ich habs gerade probiert ich schreibe :

dd if=C:\Python27/test12.txt of=F

wenn ich mir dan aber mit einem hexeditor(HxD) die SD karte ,die bei mir 
das Laufwerk F: ist ansehe, sehe ich das File nicht.

Mfg Hermann

von Oliver R. (superberti)


Lesenswert?

Nun ja, die Syntax zu "dd" solltest Du schon kennen, bevor Du das 
Kommando benutzt. "dd --list" zeigt Dir die Partitionsnamen an, die Du 
dann verwenden musst. Bei meinem USB-Stick lautet das z.B.
"of=\\?\Device\Harddisk2\Partition0". An Deiner Stelle würde ich ja das 
"--filter=removable" nie weglassen!

Gruß, Oliver

von MagIO (Gast)


Lesenswert?

Weil oben Python erwähnt wurde und mir gerade langweilig war hab ich mir 
mal einen Python crash-Kurs gegönnt. Hier das Ergebnis:
1
import linecache
2
lineend = 0
3
lineno = 1
4
5
empty_sector = ""
6
char_no = 0
7
while char_no < 512:
8
        empty_sector = empty_sector + " "
9
        char_no = char_no + 1
10
11
12
out_file = open( "c:/opt/Temp/Sec_out.txt", "w" )
13
while not lineend:
14
  aline = linecache.getline( "c:/opt/Temp/SplitDemoText.txt", lineno )
15
  lineno = lineno + 1
16
  if len( aline ) == 0:
17
    lineend = 1
18
        if len( aline ) > 0:
19
          out_line = aline[ 0:len( aline )-2 ] + empty_sector[ len( aline )-2:512 ]
20
                out_file.write( out_line )
21
out_file.close()

Sicher würde ein Python-Profi das anders/besser machen, aber für die 
allererste Stunde Python geht's und Liefert das, was gebraucht wird.

Einfach die Filenamen entsprechend anpassen und schon hast Du ein File, 
welches 512 byte pro Zeile hat.

Das dann einfach auf eine frisch formatierte SD-Karte kopieren und FAT 
bleibt erhalten. Musst halt in Deinem Programm herausfinden oder 
hardcoden wo der erste Sektor der Datei liegt.

Oder du nimmst dd und schreibst das File Sektorweise auf die SD-Karte.

von MagIO (Gast)


Lesenswert?

PS: das "if len( aline ) > 0:"
liegt eigentlich auf der gleichauf mit dem "if len( aline ) == 0:"

Ebenso "out_line = aline[ 0:len( aline )-2 ] + empty_sector[ len( aline 
)-2:512 ]"
und "out_file.write( out_line )"

Hat das Forum-System scheinbar was dagegen! Vermutlich ist es durch den 
Mix von Tabs/Spaces durcheinander gekommen.

von Hermann (Gast)


Lesenswert?

Oliver R. schrieb:
> "dd --list" zeigt Dir die Partitionsnamen an, die Du
> dann verwenden musst. Bei meinem USB-Stick lautet das z.B.
> "of=\\?\Device\Harddisk2\Partition0". An Deiner Stelle würde ich ja das
> "--filter=removable" nie weglassen!

Wenn ich bei cmd "dd --list" eingebe kommt
"unrecognized option Try ´dd --help´"

und im help stehen dan die üblichen funktionen wie if,of,bs usw ..
--filter=removable schmeist er mir genau das selbe raus .

komm ich sonst irgendwie zu dem Pfad? oder mache ich was falsch?

von Oliver R. (superberti)


Lesenswert?

Also ich galube, wir reden nicht vom gleichen "dd" for windows.
Meins habe ich hier her:

http://www.chrysocome.net/dd

Gruß, Oliver

von asdf (Gast)


Lesenswert?

1
infile=open("in.txt","r")
2
outfile=open("out.txt","w")
3
for line in infile:
4
  # Zeilenumbruch wegmachen
5
  line=line.strip()
6
  # auffuellen
7
  line=line+(512-len(line))*"\0"
8
  outfile.write(line)

von MagIO (Gast)


Lesenswert?

Ich wusste doch, dass es besser geht!

Wäre ich nicht über den linecache gestolpert ... wer weiß wie es dann 
aussehen würde. Auf .strip() und *"\0" kommt man auch nicht so einfach 
in nem ultra-schnellen Selbststudium ohne Tuts - also ausschließlich 
anhand der Hilfe.

Danke @asdf

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.