Hallo, ich suche nach einem möglichst einfachen Algorithmus, mit dem ich einen Bitstrom (z.B. SPI/I2C/UART) verpacken kann. RLE ist bisher der Favorit. Allerdings brauche ich noch eine Möglichkeit, die Bits einzeln anspringen zu können, ohne dabei immer von Anfang an lesen zu müssen. Meine Idee hierzu wäre z.B. alle 10000 Datenbytes einige Steuerbytes mit dem Datenoffset einzufügen. Meine Frage lautet, ob es dafür bereits etwas Besseres/Einfacheres/Fertiges gibt? Gruß Hans
Wieso nennst Du das Bitstrom? Übertragen werden immer komplette Bytes, also kannst Du das als Bytestrom auffassen. Und was meinst Du mit "verpacken"? RLE lässt auf komprimieren schließen. Was genau hast Du vor?
Es werden eine Menge Daten vom Mikrocontroller an den PC übetragen (im MBytes-Bereich) und die sollen am PC visualisiert werden, und zwar als Bits. Das ergibt dann einen Graph mit unzähligen Wertenpaaren. Bei den Daten selber handelt es sich um die oben genannten Schnittstellen, die ich binär abtaste. Es kommen also viele gleiche Wertepaare zustande, die sich auch gut packen lassen (Überabtastung und relativ wenige Pegelwechsel). Ich versuche über eine Dauer von mehreren Minuten aufzuzeichnen. Wenn man sich jetzt z.B. den Zeitpunkt 4:17:46 Minuten anschauen will, dann kann ich das nicht vom Zeitpunkt 'Null' aus berechnen, was bei einer RLE-Codierung unumgänglich wäre.
Hans schrieb: > Bei den Daten selber handelt es sich um die oben genannten > Schnittstellen, die ich binär abtaste. Versuchst Du einen Logikanalysator zu programmieren?
Genau, aber um es vorwegzunehmen: die vielen anderen Threads zum Thema enden leider meist schon beim Versuch sich auf die Hardware und Funktionalität des Loggers zu einigen. D.h. bzgl. Datenformat/-auswertung ist da wenig/nichts zu finden.
Also sowas in der Art:
1 | #define M_BYTE 1024*1024
|
2 | |
3 | byte pData[512*M_BYTE]; |
4 | |
5 | byte *pOffset[512] = {(byte*)pData[0*M_BYTE],(byte*)pData[1*M_BYTE],(byte*)pData[2*M_BYTE],...} |
Ganz so wird es wohl nicht funktionieren (die Offsets werden nicht äquidistant ausfallen wegen RLE), aber sonst spricht wirklich nichts dagegen - sehr guter Vorschlag. Ich probiers mal aus - Danke für den Tipp! Gruß Hans
Hans schrieb: > Ich versuche über eine Dauer von mehreren Minuten aufzuzeichnen. Wenn > man sich jetzt z.B. den Zeitpunkt 4:17:46 Minuten anschauen will, dann > kann ich das nicht vom Zeitpunkt 'Null' aus berechnen, was bei einer > RLE-Codierung unumgänglich wäre. Warum soll das nicht möglich sein? Was hat den die Kompremierung während der Übertragung damit zu tun, wie am PC die Daten im Speicher vorrätig gehalten werden? Am PC hast du Speicher massenhaft, auf der Empfangsseite wird die Kompression wieder aufgehoben und du hast die Daten so, dass du sie gut und komfortabel visualisieren kannst. Du musst die Dinge voneinander trennen! Eine bestimmte Art der Übertragung bedeutet nicht, dass die Daten auch so gespeichert werden müssen. Dein Übertragungskanal ist für die Software-Box davor und die Softwarebox danach eine Black-Box. AVR-Aufnehmer -----> Übertragung ------> Auswertung (PC) Auf der einen Seite schiebt der AVR Daten in die Übertragungsbox rein, auf der anderen Seite purzeln sie beim PC wieder raus. Das der 'Baustein' Übertragung zwecks Erhöhung der Bandbreite eine RLE-Codierung macht, ist weder das Bier des Bausteins 'Aufnehmer' noch ist es das Bier des Bausteins 'Auswertung (PC)'. OK, beim Aufnehmer kann man Zugeständnisse machen, weil ein AVR nun mal schnell in Speichernot kommt. Aber auf dem PC gilt das nicht.
Hallo Karl Heinz, natürlich geht das. Das Problem dabei ist aber, dass ich dann (z.B. bei RLE) für den genannten Zeitpunkt erstmal 10 MByte an Daten parsen muss - und zwar Byte für Byte - um den richtigen Zeitpunkt zu finden. Ich kann dann nämlich nicht mehr einfach sagen: bei einem Byte pro Mikrosekunde muss ich also für eine Minute 60*1000*1000 Bytes vorspulen, sondern ich muss von vorne anfangen und jedes Byte dekodieren und dann aufaddieren. Das dauert vermutlich ewig. Ich hab mich da etwas schlecht unverständlich ausgedrückt. Gruß Hans
Ach, sorry Karl Heinz, jetzt hab ich Dich falsch verstanden. Ich will die Daten ja erst am PC komprimieren. Gruß Hans
Hans schrieb: > Ach, sorry Karl Heinz, > > jetzt hab ich Dich falsch verstanden. Ich will die Daten ja erst am PC > komprimieren. Ahh. Ok. Das hab ich wiederrum nicht aus der Anfrage herausgelesen. Ich dachte, dir geht es um die Übertragung. > Das dauert vermutlich ewig. Na ja. Ewig ist übertrieben. Entweder Index wie bereits angesprochen oder einfach jede 10 Sekunden / 20 Sekunden / ... einen neuen RLE Datenstrom anfangen. > Ganz so wird es wohl nicht funktionieren (die Offsets werden nicht > äquidistant ausfallen wegen RLE) Das kannst du aber regeln. Schreibt ja keiner vor, dass du immer alle Bytes zusammenfassen musst :-)
Ich mache das mit einem zweiten Array, der die Datenoffsets enthält. Den lese ich dann aus und springe mit dem nächst gelegenen Index in den Zeiger-Array. Von dort geht es dann zu Fuß weiter.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.