Definiere Dir ein universelles Datenformat, das Deinen möglichen
Anforderungsbereich möglichst kompakt abdeckt. Beispiel: Du willst
GPS-Positionen, Spannung und Strom über die Zeit auftragen und zwar in
unterschiedlichen Intervallen ab einer Sekunde (aber z.B. GPS-Daten nur
selten, wenn sie sich nur langsam ändern).
Dein Format muß also jeweils aus einem Kopf bestehen, der verrät, was
für ein Wert dort gesichert wurde und wie lang das Feld ist, sowie aus
dem Wert selbst.
Um wenig Overhead zu haben, soll der Kopf nur ein Byte lang sein, davon
sind dann z.B. 5 Bit die Sekunden seit dem letzten Wert, die restlichen
drei Bit markieren die Art der Daten (GPS oder Strom oder Spannung).
Damit hast Du aber nur eine relative Zeit, Du definierst Dir also noch
ein weiteres Feld für die Absolutzeit. Nehmen wir:
1) Absolutzeit 001xxxxx
(7 Datenbytes für Jahr, Monat, Tag, Stunde, Minute, Sekuden)
2) GPS-Position 010xxxxx
(6 Datenbytes für 3xLänge und 3xBreite)
3) Spannung 011xxxxx
(1 Datenbyte mit der Spannung)
4) Strom 100xxxxx
(2 Datenbytes mit dem Ladestrom
Nun seien Deine Eingangsdaten (mal extrem)
10:00:00 GPS-Position X
10:00:03 Spannung A
10:00:03 Strom B
10:00:30 GPS-Position Y
10:00:40 Spannung C
10:00:41 Spannung D
10:02:00 Spannung E
Dann beginnst Du mit der Absolutzeit und dann relativen Daten:
$20 2005 06 21 10 00 00 (Absolutzeit)
$40 ll ll ll bb bb bb (GPS-Position, 0 Sekunden später)
$63 aa (Spannung, 3 Sekunden später)
$80 bb bb (Strom, 0 Sek. später, also mit der Spannung)
$5B ll ll ll bb bb bb (010 11011 GPS-Position nach 27 Sek.)
$6A cc (011 01010 Spannung nach 10 Sek)
$61 dd (011 00001 Spannung nach 0 Sek)
$1F (000 11111 Nichts nach 31 Sek, 10:01:12)
$1F (000 11111 Nichts nach 31 Sek, 10:01:43)
$71 ee (011 10001 Spannung nach 17 Sek, 10:02:00)
Zum Schluß habe ich noch einen Trick eingeführt: wenn über eine halbe
Minute keine Daten kommen, ist keine relative Zeit mehr möglich. Damit
man nicht immer einen neuen (großen) Block mit der Absolutzeit
schreiben muß, definiert man sich noch einen leeren Block (000xxxxx),
der nur die relative Zeit vor sich herschiebt, ohne Daten zu tragen;
damit kann man kurze Pausen gut Überbrücken.
Beim Parsen hat man dann eine Schleife mit etwas wie
Zeit += Byte[Position] & 0x1F;
switch (Byte[Position++])
{
case 01:
// Absolutzeit parsen
Position += 7;
break;
case 02:
// GPS-Position parsen
Position += 6;
break;
case 03:
// Spannungswert verarbeiten
Position++;
break;
case 04:
// Stromwert verarbeiten
Position += 2;
break;
}
Was noch fehlt, ist eine Abbruchbedingung, wo denn die
Datenaufzeichnung zuende ist. Man könnte ein Nullbyte als Header
nehmen; bei Aufzeichnung auf Flash wäre ein $FF aber wohl sinnvoller.