Mehrere COM-Ports synchronisieren

H

Harry64

Hallo zusammen,

folgendes Szenario. Ich verwende 2 COM-Ports, über die byteweise Daten ankommen. Allerdings kommen die Daten in Frames, d.h. es gehört immer eine definierte Anzahl an Bytes zu einem Paket. Diese Daten sollen kontinuierlich gespeichert werden. D.h. in der Reihenfolge, wie sie eintreffen. Wenn allerdings an COM1 gerade ein Frame kommt, sollen die Daten, die an COM2 ankommen zwischengespeichert und nach dem Ende des Frames auf COM1 als nächstes behandelt werden. Kommen unterdessen an COM1 Daten an, sollen diese wieder zwischengespeichert werden.

Beispiel:

An COM1 kommt der Frame AA BB CC DD an. Zum Zeitpunkt t1 kommt also AA an. Zum Zeitpunkt t1 und t2 gibt es auf COM2 keine Daten. Der Frame für COM2 ist EE FF. Kommt bei t3 EE an COM2 an, dann soll der Wert zwischengespeichert werden und erst zum Zeitpunkt t4 an die Ergebnisliste angehängt werden, die dann AA BB CC DD EE FF lautet, obwohl EE eigentlich vor DD ankam. Hoffe das war halbwegs verständlich.

Hat jemand eine Idee, wie man das synchronisieren kann?

viele Grüße

Harry
 
Ich würde vorschlagen für jeden Port einen Thread zu starten.

Wenn der Port der als erster ein Byte empfängt auch zuerst bedient werden soll
-also nicht der der als erster sein Paket fertig hat müsste man sowohl einen lokalen
Zwischenspeicher (Ringpufffer ?) pro Port alsauch eine gemeinsame Liste haben.
Vermutlich wäre es etwas günstiger wenn der Port der als erstes ein vollständiges
Packet empfangen hat zum Zuge kommt.

Die gemeinsame Liste müsste dann für beide Threads, über eine Mutex-
Semapore gesichert, die Daten in chronologischer Abfolge erfassen.

Das Hauptprogramm, oder ein weiterer Thread kümmern sich dann um die
weitere Verarbeitung der Daten.

--

Als Variante könnte man die Daten auch als Message an den verarbeitenden Thread
senden und sich so die Liste inklusive Semaphoren sparen. Die Message würde
dann die Synchonisierung sicherstellen. Allerdings muss sich dann der veararbeitende
Thread merken wer zurst war und für jeden Port jeweils getrennt speichern bis das Paket
komplett ist. Das versenden der Message muss natürlich so programmiert werden, das
alle Daten die anfallen auch gesendet werden können, ohne das der Aufruf blockiert.

Frage:
Was passiert wenn ein Packet nicht komplett empfangen wird - dann würde alles hängen, oder ?
 

Neue Beiträge

Zurück