Forum: PC-Programmierung Bitstrom verpacken


von Hans (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Hans (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Hans (Gast)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

Ich wuerd eine zweite Datei mit Indexpointern erstellen.

von Hans (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

Ja schlecht unverständlich^^ eben!

von Hans (Gast)


Lesenswert?

Ach, sorry Karl Heinz,

jetzt hab ich Dich falsch verstanden. Ich will die Daten ja erst am PC 
komprimieren.

Gruß Hans

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Hans (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.