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!
Die Wartezeit habe ich entfernt. Dies brachte aber keinen großen Erfolg. Das Protokoll wurde auch erweitert. Habe dazu eine Konsolenanwendung geschrieben, die Werte zunächst codiert und dann wieder decodiert. Dies funktionierte wunderbar. Die Decodierung wurde dann in das LabVIEW Projekt eingebunden. Auf der anderen Seite der Schnittstelle wurde die Codierung eingebunden.
Beim Test ist zu erkennen, dass manchmal richtige Werte ankommen, nach mehrmaligem Neustarten des VI. Jedoch wenn einmal ein richtiger Wert erfasst wurde, dann aktualisiert sich nichts.
An das VISA Serial habe ich einen Schalter gesetzt, damit das Abschlusszeichen deaktiviert wird.
Die „Index Array“ Funktion verstehe ich nicht so ganz.
Also in C Pseudocode stelle ich mir das Ganze so vor:
"Die „Index Array“ Funktion verstehe ich nicht so ganz."
Was verstehst du da nicht so ganz? Man gibt ein Array vor und sagt, welche Elemente man davon haben will... In deinem VI entspricht das "Array[i], Array[i+1], Array[i+2], Array[i+3]" mit i=0.
"in C Pseudocode"
Dein VI entspricht dem doch weitgehend.
"dann aktualisiert sich nichts."
Du müsstest nur schon ausgewertete Bytes aus deinem String wieder entfernen, da du sonst immer wieder die gleichen 4 Byte vom Stringanfang auswertest... Oder dir halt merken, bis zu welcher Stelle im String du schon ausgewertet hast (also einen Zähler entsprechend deinem "i" mitführen).
Wäre schön, wenn es so einfach wäre. Deine VISA_WERTE_holen Funktion sollte aber intelligenter sein, weil sie noch den Anfang deiner 4 Bytes erkennen soll. Ausserdem muss dein Programm online funktionieren, deshalb solltest du lieber nur 4 Bytes von der Schnittstelle lesen und den Rest im seriellen Buffer lassen (dabei soll ich sagen, dass es diesen Rest normalerweise nicht gibt, da deine Berechnung schneller funktionieren sollte, als die Übertragung der Daten).
Konkrete Fragen zu deinem Pseudocode wären:
Wieviel Bytes soll VISA Lesen lesen? Alle, die es im seriellen Puffer gibt? Was passiert wenn es weniger als 4 sind?
Wie stellst du sicher, dass Array[i] wirklich der erste Byte von vier ist?
Ich lege jetzt immer einen Index an die "Index Array" funktion. Nun klappt das auch soweit mit dem Decodieren.
Ja ein Problem ist es noch mit der seriellen Schnittstelle, da der string immer voller wird und das Ganze nach einer Zeit immer langsamer wird und hängen bleibt. Meine Idee wäre eine Art Ringspeicher zu generieren. Da meine Daten ja schneller angezeigt werden, als sie über den Bus kommen, könnte man doch den Speicher der angezeigten Werte wieder frei geben für neue Werte. WIe kann man sowas umsetzen?
Die Idee nur vier Bytes aus dem Lesespeicher zu lesen hört sich auch interessant an. Wie kann ich dies am besten machen? Entsteht dann auch wieder das Problem, das der Puffer überläuft? Sonst wäre die ja die eleganteste Lösung.
Habe es wie bei "Ungefähr so " aufgebaut. Problem ist, dass wieder nur einmal Werte geholt werden. Der aktuelisiert noch nicht. Muss ich noch irgendwas ändern?
Hier nochmal das VI mit den mitlerweile erstellten subVIs. An dem Protokoll hat sich nur geändert, dass jetzt acht Bytes übertragen werden können (Protokoll funktioniert alles Wunderbar, habe ich getestet). Es geht jetzt nur um die serielle Verbindung. Wenn ich es wie auf dem angehängten Bild aufbaue funktioniert es, jedoch schreibt er den Puffer wohl voll und irgendwann wird es langsam und stürzt ab (nach ca. 3 Minuten).
Wenn ich es so wie in dem angehängen VI mache funktioniert es gar nicht mehr.
Ich möchte es so machen, das nach Möglichkeit der Speicher, der schon verarbeiteten Bytes, wieder freigegeben wird und nicht mehr zur Last fällt.