Forum: FPGA, VHDL & Co. Datenübertragung RS232 Formatierung


von Gustl B. (-gb-)


Lesenswert?

Hallo,

also es funktioniert alles :-D Ich bekomme von aussen Bitmuster in den 
FPGA die ich zusammen mit einer genauen Zeit (1us) im FPGA in einen 
großen FIFO stecke und dann über RS232 mit 115k Baud an den PC schicke.

Am PC nehme ich die ankommenden Bytes mit Realterm in eine Datei auf und 
baue danach mit einem C-Programm daraus ein Spektrum bei dem man dann 
Zeitschwellen setzen kann.

Also ich schicke da immer 6 Bytes, 4 für die Zeit und 2 mit dem 
Bitmuster. Jetzt muss ich natürlich wissen wo immer die nächsten 6 Bytes 
beginnen. Das mache ich derzeit (Testphase) per Hand mit den Hexeditor, 
aber das ist natürlich keine Lösung.

Zur besseren Lesbarkeit der Bytes schicke ich jetzt nach jeden 6 Bytes 2 
weitere Bytes mit Nullen. Aber wenn ich das jetzt so schneide, dass die 
Datei genau richtig anfängt, kann das C-Programm da auch nur ein valides 
Spektrum draus bauen, wenn in der Mitte kein Byte fehlt und auch sonst 
alles ok ist.

Bisher hatte ich nie fehlerhafte Daten und errechneten Spektren sahen 
immer identisch aus mit den generierten die ich an den Eingang gegeben 
habe, aber nur weil es bisher geklappt hat ist das nicht immer so 
vermutlich.

Wie schickt man Daten am besten? Also so, dass ich das schön mit einem 
C-Programm parsen kann und einfach erkenne ob ein 6-Byte Packet ok ist 
oder nicht und das fehlerhafte dann verwerfe.

Ich meine wenn ich jetzt zum Parsen immer 2 Bytes mit Nullen dazwischen 
schicke, könnten genau solche Bytes aber auch in einem validen 6-Byte 
Packet stecken.

Vielen Dank!

von Tobias (Gast)


Lesenswert?

Hallo,

das gleiche Problem haben auch andere Protokolle wie z.B. Ethernet.

Du hast ein Startflag (0x00, 0x00). Nun können die Nutzdaten auch ein 
0x00, 0x00 enthalten... blöd.

Lösung: Bit stuffing

Wikipedia:

Beim Bitstuffing im Ethernet wird nur nach 5 Einsen eine Null eingefügt. 
Eine Reihenfolge aus Nullen ist egal. Eine Ausnahme ist die Reihenfolge 
01111110, welche das Ende und den Anfang markiert. Bitstuffing dient bei 
Ethernet der Vermeidung von Bitfolgen, die im Datenfeld eines Frames als 
Steuerzeichen interpretiert werden könnten.

Also heißt das: Nach 5x '1' kommt immer eine '0', die der PC bei dir 
dann einfach erkennt und entfernt. Sollten mal 6x '1' kommen, dann hast 
du ein Stopp/Start Frame erhalten.

Alles klar? :)

von Cyblord -. (cyblord)


Lesenswert?

1.)Du kannst deine Daten in einem Paket zusammenfassen. Du definierst 
ein Startbyte (z.B. 2) und ein Endbyte (z.B. 3) und hängst an die 
Nutzdaten noch eine CRC Checksum an. Dann bist du schonmal recht sicher.

2.)Ansonsten kannst du ein "Escape-Zeichen" definieren, welches vor 
Steuerbytes gesetzt wird, und diese von den Daten unterscheidet. Wann 
immer diese Escape-Zeichen in den Daten auftaucht, wird es vor dem 
Senden gedoppelt. Der Empfänger ersetzt alle doppelten Escape-Zeichen 
durch ein Einzelnes. Und jedes Zeichen welches direkt nach einem 
Escape-Zeichen kommt, interpretiert er als Steuerzeichen.

Allerdings würde ich diesen Aufwand nicht treiben, sondern die Variante 
1 nehmen.

gruß cyblord

von Gustl B. (-gb-)


Lesenswert?

Sper, also das ist ja schonmal fein! Also Bitstuffing habe ich jetzt so 
verstanden, aber ich will eigentlich die Datei die ich bekomme Byteweise 
auswerten/parsen und nicht auf Bitebene. Kann ich beim Bitstuffing 
weiterhin meine feste Länge behalten oder ist das dann undefiniert als 
Datenstrom?

Das mit festem Start- und Stoppbyte und CRC finde ich am einfachsten - 
führt aber zu deutlich Overhead.

Hm ... oder ich baue einen Header der nicht in der Payload vorkommen 
kann, also Payload sind ja 6 Bytes, also könnte ich nen 6 Byte langen 
Header mit lauter Einsen schicken weil das Bitmuster immer auch Nullen 
enthält.

Geht das eigentlich in C etwas Bitweise zu parsen?

von Peter II (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Geht das eigentlich in C etwas Bitweise zu parsen?

Bitstuffing macht mit C keine sinn, soetwas sollte man in Hardware 
machen.

Auch mit Header und CRC muss man Escapen. Das auch auch das einfachste 
was man in C machen kann.

von Gustl B. (-gb-)


Lesenswert?

Wie man das mit VHDL zerlegt oder baut ist mir klar aber ich muss das 
eben dann am PC mit einem Stück Software parsen. Ich glaube auch wenn es 
viel Overhead verursacht werde ich ein eindeutiges Startpaket bauen und 
ne Ckecksumme ranhängen.

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.