LabVIEWForum.de
Serielle Kommunikation - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Instrument IO & VISA (/Forum-Instrument-IO-VISA)
+---- Thema: Serielle Kommunikation (/Thread-Serielle-Kommunikation)

Seiten: 1 2 3 4


Serielle Kommunikation - labuser2010 - 14.07.2010 16:02

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:

while(){
Array = VISA_WERTE_holen;

FunktionDecodierung(Array[i], Array[i+1], Array[i+2], Array[i+3]){

Berechnung…….

ADC1 =…..;
ADC2=…...;


}

i++;

}


Serielle Kommunikation - GerdW - 14.07.2010 20:40

Hallo labuser,

"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).


Serielle Kommunikation - eg - 14.07.2010 21:03

Hi labuser!

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?

Gruß, eg


Serielle Kommunikation - labuser2010 - 15.07.2010 09:17

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?


Serielle Kommunikation - labuser2010 - 15.07.2010 09:26

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.


Serielle Kommunikation - eg - 15.07.2010 12:03

Ungefähr so


Serielle Kommunikation - labuser2010 - 15.07.2010 13:40

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?


Serielle Kommunikation - jg - 15.07.2010 14:26

' schrieb:Habe es wie bei "Ungefähr so " aufgebaut.
Eine sehr präzise Aussage...
' schrieb:Problem ist, dass wieder nur einmal Werte geholt werden. Der aktuelisiert noch nicht. Muss ich noch irgendwas ändern?
Glas1...Glas2, VI-Upload? Oder bist du immer noch bei dem Status wie in #1? Dann genau vergleichen!

Gruß, Jens


Serielle Kommunikation - labuser2010 - 15.07.2010 14:44

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.

Lv09_img2


Serielle Kommunikation - eg - 15.07.2010 15:02

Also ich bin hier raus, sorry.

Gruß, eg