Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
1) Daten asynchron mit VISA über serielle Schnittstelle auslesen und in eine Queue reinschreiben
2) Daten aus dieser Queue auslesen und mit Concantenate Strings in einen Parser (Schiftregister) dazuhängen. Dieser Parser holt das Paket aus dem Schieberegister, nach dem das Paket alle Prüfungen bestanden hast, raus.
3) Das geparste Paket wird in eine neue Queue reingeschmissen.
4) Diese Queue wird ausgelesen und das entsprechende Paket wird angezeigt.
Dabei kommen zwei Pakete mit 100 Hz und andere 15 mit 10 Hz.
Das Problem ist, wenn die Pakete viel zu schnell kommen, wird meine zweite Queue irgendwann mehr als ein Paket hat, weil meine Nachfolgertasks mit der Berechznung und Darstellung nicht nachkommen. Z.B. hat diese 100 Pakete, die angezeigt werden sollen. Diese werden aber zu langsam angezeigt, weil ich einen Timeout von 100 ms in meinem Parser habe, aber die Queue mit Rohdaten keine Elemente mehr hat, weil auch keine Daten an der seriellen Schnittstelle (wenn ich diese trenne) anliegen. Somit läuft meine Parsetask und auch alle nachfolgenden Tasks zu langsam.
Was könnt ihr vorschlagen? Ich denke dabei an eine Case-Struktur, die z.B. die Queuegrösse überprüft und abhängig davon meinen Timeout vergrössert oder verkleinert.
Aber nein, gerade umgekehrt, wenn ich deinen Vorschlag richtig verstanden habe. Wenn keine Daten in der Queue mit Rohdaten sich befinden, soll die Task in der Mitte schnell den Schieberegister abarbeiten. Sorry, dass ich micht vielleicht nicht klar ausgedrückt habe.
P.S. mir ist gerade noch aufgefallen, dass man Task1 und 2 vereinigen könnte, aber das löst das Problem trotzdem nicht. Wenn ich das mach muss ich auf VISA startt auf die Queue mit Rohdaten warten.
Erste Schleife holt Daten und legt sie in die 1Q.
Zweite Schleife - wenn was in der 1Q dann, rausholen und in das Schieberegister reinlegen, schieberegister
weiterverarbeiten.
- wenn nix in der 1Q dann, nur schieberegister weiterverarbeiten und in die 2Q eintragen.
Ja, so wie du es vorgeschlagen hast wird funktionieren. Mir gefällt aber nicht, dass wenn in der Q1 keine Daten sind, aber auch im Schieberegister nichts zu verarbeuiten ist, dann läuft die Task2 viel zu schnell und frisst die CPU.
den vergleich musst du ja noch anpassen.
musst halt mal schauen was denn so, in deinem string, übrig bleibt. Null wird der nicht werden weil du ja immer wenigstens das letzte
im String hast.
1) Schauen wie viele Bytes am Port anliegen
2) Wenn mehr als 0, dann in den Schieberegister dazuhängen und parsen
3) Wenn 0, dann schauen ab mein Schieberegister Daten hat, wenn
4) Daten im Schieberegister, dann parsen
5) Wenn keine Daten im Schieberegister, dann auf VISA Event warten