www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie entwirft man ein Dateiformat?


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen Datenlogger mit einem ATMega644p gebaut der Daten von 
Sensoren auf eine SD Karte speichert. Alles funktioniert soweit ganz gut 
(danke für die Unterstützung hier aus diesem Forum:-)).

Die Sensoren liefern die Daten bisher im ASCII Format und ich schreibe 
sie so auf die SD-Card. Ich kann sie dann am PC leicht lesen und habe 
etwas Software zur Auswertung geschrieben.

Nun sollen aber (zusätzlich) andere Sensoren angeschlossen werden, die 
ihre Daten als Binärwerte zum ATMega (über UART) senden.

Nun könnte ich diese einfach in Strings umwandeln und so auf die Karte 
schreiben.

Das würde aber die Datenmenge (unnütz) vergrößern (für einen 16Bit 
Messwert werden dann aus zwei Byte fünf) und wäre auch irgendwie 
"unelegant", schließlich braucht sie mein Auswertungsprogramm im PC am 
Ende auch wieder als Binärdaten.

Ich müsste mir also ein Datenformat ausdenken. Es muß zwar nur von 
meiner Softwaren (im µC und im PC) gelesen und geschrieben werden aber 
ich würde es trotzdem gern so designen wie das " professionell " gemacht 
werden würde.

Wie geht man an so etwas heran?

Wie trennt man einzelne Datensätze? In einer Textdatei kann man das 
durch Zeilenumbrüche machen. Falls dann einmal ein Datensatz aus 
irgendeine Grund nicht richtig gemessen, übertragen oder gespeichert 
wurde, kann diesen einen Datensatz ignorieren und nach dem nächsten 
Zeilenumbruch weitermachen.
Wenn ich einfach binärwerte hintereinander auf die Karte schreibe und es 
irgendwo einen Fehler gibt, käme ja alles was danach kommt "außer 
Tritt".

Bin gespannt auf Euere Anregungen :-)

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich würd die Werte als ASCII speichern, mit Kommata/Semikolons als 
Trenner

Autor: aha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig bemerkt. Durch Redundanz kann man die Fehlerwahrscheinlichkeit 
verbessern. Die erste Frage in diesem Zusammenhang ist, ob die 
Datensaetze immer dieselben sind, resp man mit einer einzigen 
Recordstruktur durchkommt, oder ob mehrere Records unterschiedlich 
haeufig auftreten. Ob man als ASCII oder binaer abspeichert ist nochmals 
eine entscheidung. ASCII ist besser leserlich. Vernuenftigerweise 
implementiert man beide, und kann mit einer Boolean umschalten.

Autor: Daniel D. (bademeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also in vielen Dateiformaten werden zunächst einmal bestimmte "Felder" 
deklariert.

Eine Datei beginnt demnach mit einem Header. Hier werden gewisse Sachen 
wie etwa Sensorname, Messfrequenz o.ä festgelegt. Ebenso sollte dort 
auch die Angabe der Anzahl an Messwerten stehen und wo die Startadressen 
der Werte (oder andere Sachen) sowie Größe vom Header selbst sein.

Meist folgen an den Header dann die Daten. Das Format sollte dann so 
gewählt werden, dass wenig umgewandelt werden muss sofern man dann nicht 
direkt MB-Monster erhält.

Edit:
Einen wichtigen Punkt hab ich vergessen. Im Header sollte auch angegeben 
werden wie die Datei gespeichert wurden. Also entweder im Klartext, 
binär, BCD..etc

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vor allem am Anfang der Datei eine Kennzeichnung des Formats (Magic) und 
der Formatversion vorsehen.

Text sollte bei den heutigen Größen von SD-Karten kein Problem sein.

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grundsätzlich gibt es vier Mittel:
1. Du legst die Abfolge der Daten auf dem Papier fest und schreibst das 
Programm so, das es diese Daten in eben dieser Abfolge schreibt und 
liest.
2. Du legst feste Grössen für die Daten fest; benötigst Du also keine 
Trennzeichen.
3. Du legst bestimmte Tags fest, welche die Daten inhaltlich 
kennzeichnen
z.B. Zwei Messstellen A und B
Also: "A:xxx.xxB:yyy.yy"
4. Du definierst ein Trennzeichen.

Wobei
1. und 2.
3.
1. und 4.

sinnvolle und ausreichende Kombinationen geben.
Du kannst natürlich immer noch ein Mittel mehr nehmen, das dann eine 
Redundanz gibt

>Wie trennt man einzelne Datensätze? In einer Textdatei kann man das
>durch Zeilenumbrüche machen. Falls dann einmal ein Datensatz aus
>irgendeine Grund nicht richtig gemessen, übertragen oder gespeichert
>wurde, kann diesen einen Datensatz ignorieren und nach dem nächsten
>Zeilenumbruch weitermachen.
Das Trennzeichen wäre also festgelegt, aber nicht die absolute Länge der 
Daten oder deren Bedeutung oder Abfolge.

>Wenn ich einfach binärwerte hintereinander auf die Karte schreibe und es
>irgendwo einen Fehler gibt, käme ja alles was danach kommt "außer
>Tritt".
Hier ist weder Abfolge oder Länge, noch Bedeutung noch Trennzeichen 
festgelegt. Kein Wunder, das da was aus dem Tritt kommen kann.

Autor: mr.chip (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daten als Strings speichern ist gar nicht so schlecht, wenn man genügend 
Platz hat. So kann man die Datei per Texteditor lesen und editieren, was 
durchaus nützlich ist. Also alles andere als unelegant.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm ASCII-Text / CSV.

Das bischen Ersparnis in der Dateigröße für ein binäres Format kann ja 
nicht so schwer wiegen, eine 2GB SD-Karte kostet ja nix mehr...

Und wenn doch, gzip o.ä. ist auch nicht soo kompliziert zu 
implementieren, und macht den ASCII-Overhead mehr als wieder wett.

Autor: sokrates (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
XML.

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'sokrates mit XML' - das hat was ;-)

Wenn er sich dann noch Gedanken über Multiplattform und irgendeine Form 
von Inhaltsübersicht macht, damit der Texteditor beim Lesen von 2GB 
nicht den Rechner killt, das wäre wohl ultimativ.


Gruß -
Abdul

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bevorzuge für "lesbare" Daten auch csv.
Kann man nitfalls in jedem Editor öffen, sonst in Excel/Calc einlesen 
oder, wie ich es gerade in Arbeit habe, mit ein paar Zeilen php o.ä. in 
eine MySQl-Datenbank tragen.

Geht zwar prinzipiell mit anderen Formaten auch, aber warum soll ich mit 
das Leben unnötig schwer machen.

PS: auf einen 16MBit Flash (2MByte) passen so 3 Wochen Daten mit
Datum, Uhrzeit, Sensornummer, Temperatur, (Feuchte), (Luftdruck), 
Status.
6 Sensoren bis jetzt, 6x Temperatur, 4x Feuchte, 1x Luftdruck.
Gespeichert wird alle 5 Minuten.

Gruß aus Berlin
Michael

Autor: faustian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JSON :)

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.