PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Sprache C#] Datenstrom von Serieller Schnittstelle verarbeiten



shedepe
22.12.2011, 12:24
Hallo

ich sitze im Moment an der Frage wie ich einen Datenstrom, der von meinem Roboter kommt am Besten wieder in einfach zu verarbeitende Datenobjekte/pakete verwandeln kann. (möglichst effizient)
Die Daten kommen immer in der Form: (alles in eckigen Klammern entspricht jeweils einem Byte)
[Startbedingung] [ID LowByte] [ID HighByte] [Length] [ersten Datenbyte] .... [letztes Datenbyte] [Kontrollbyte] [Endbedingung]

Diese Byteabfolge soll dann in ein entsprechendes Datenobjekt zerlegt werden das inetwa so aussieht:

uint ID
byte Length
byte[] Datenbytes
byte Kontrollbyte

Meine bisherige Idee ist alle Bytes zwischen einer Startbedinung und einer Endbedingung in einen Datenpuffer (Liste) zu schreiben und mit einem extra Thread diesen Datenpuffer zu verarbeiten.
Allerdings habe ich Bedenken, dass sich dann die verschiedenen Threads in die Haare kommen und es zu inkonstenten Daten kommt.
Deshalb hoffe ich, dass bereits von euch einige vor dem selben Problem standen und mir ihre Lösung davon mitteilen können

Viele Grüße

PS. Wie berechnet man am Besten ein Kontrollbyte ?

lokirobotics
22.12.2011, 15:00
Pipes and Filters (http://www.eaipatterns.com/PipesAndFilters.html). Über Pipes and Filters synchronisierst du deinen Datenfluss. Jeder Filter läuft in einem eigenen Thread. Der erste Filter sitzt an der seriellen Schnittstelle, nimmt einfach die Bytes entgegen und schiebt sie in seine Ausgabe-Pipe.
Der zweite Filter arbeitet als State-Machine, nimmt die Bytes und Packt sie in die zu erstellende Entity. Immer wenn eine Entity fertig ist, schiebt er sie wieder über seine Ausgabe-Pipe raus.
Das Längen-Byte würde ich rausnehmen, die Länge kriegst du sicherer über das Byte-Array selbst.

Es gibt hunderttausend Möglichkeiten, das Kontrollbyte zu errechnen. Eine Möglichkeit wäre, einfach alle Bytes per XOR zu verknüpfen. Aufwändiger, aber sicherer ist eine Huffman Codierung. Da geht dir aber Bandbreite verloren. Vorteil ist eine sehr viel höherer Fehlererkennungsfähigkeit und sogar die Möglichkeit, Fehler zu korrigieren.

shedepe
23.12.2011, 13:29
Vielen Dank für deine Hilfe, ich werde mal versuchen so ein Architekturmuster die nächsten Tage zu implementieren und melde mich dann zurück.
PS. dein Link funktioniert nicht.

lokirobotics
23.12.2011, 13:50
WTF? Ein l am Ende vergessen. Link is aktualisiert. :D