LabVIEWForum.de
Buffer läuft voll - 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: Buffer läuft voll (/Thread-Buffer-laeuft-voll)



Buffer läuft voll - B033el - 03.05.2010 14:53

Hallo,

Ich habe wieder ein Problem bei dem ich nicht weiter komme.
Ich nutze für die Datenerfassung einen Mikrocontroler der die serielle Schnittstelle mit meinem Rechner Verbunden ist.

Wenn ich die Erfassung starte Schickt mein µC immer 3 Byte pro Channel über die Serielle Schnittstelle.

Das erste Byte nutze ich immer um die Channelnummer zu prüfen. In den andern 2 Byte steht meine Information die ich brauche.

Im Klartext. im µC ist eine Schleife die mir immer nacheinander die Infos von 3 channels Schickt also immer 3 x 3 Byte pro Durchlauf.

Im die Daten mit LV einzulesen nutze ich eine Producer - Consumer - Struktur.

Das läuft anfangs noch recht gut. Nur irgendwann läuft mein Puffer voll (ich verliere Bytes) und meine Infos kommen durcheinander. Bzw gehen verloren.

Ich hab leider keine Ahnung warum am Anfang alles gut geht und dann später mein VISA read nicht mehr nachkommt.

ich hänge mal mein Programm an und hoffe mir kann jemand weiter helfen.

Anhang:

Wenn ich den String "S" Schicke fängt mein µC an zu senden mit "D" hört er auf.

ich hoffe ich hab mein Problem verständlich erklärt und hoffe mir kann in dieser Sache jemand weiter helfen.

MfG Michael

LV vers 8.5


Buffer läuft voll - jg - 03.05.2010 15:02

Du schreibst alle Daten in die XY-Graphen, und wunderst dich, dass irgendwann dein Speicher überläuft? Das wird so nichts.

Du musst schon die Datenmenge in den Graphen begrenzen (Stichwort: Ringpuffer). Und je mehr Daten im XY-Graph sind, desto länger dauert ein Update desselben, und genau das dürfte dein Programm ausbremsen.

Wie wäre es außerdem, gleich alle 3 Kanäle in einem VISA-Read einzulesen. Oder wie schnell kommen die Daten? Was sind denn so die Loop-Times? Alles unter 10 ms fände ich sehr heftig und sehr prozessorbelastend.

Gruß, Jens


Buffer läuft voll - B033el - 03.05.2010 15:08

Die Daten schicke mit mit 9600 bits / s .

Ich danke dir schon mal für deine schnelle Antwort und erkundige mich mal über diesen "Ringbuffer":).

Meinst du ich soll also mit einem VISA read gleich 9 Bytes einlesen und dann meine Infos daraus ziehen ?? geht das schneller als 3 x 3 zu lesen ?

Mfg Michael


Buffer läuft voll - Lucki - 03.05.2010 15:27

Die einfachste Art, zu einem Rinpuffer zu kommen, ist die Verwendung eines Signalverlaufsdiagramms - dort ist der Rinpuffer bereits eingebaut. (Historienlänge mir rechter Maustaste einstellbar).
Mit dem Signalverlaufsdiagramm lassen sich auch Signalveräufe mit nicht äquidistantem dt darstellen. Es ist allerdings etwas Tricksy, dehalb sei Dir hier verraten wie es geht:
[attachment=26181]
Also einfach die Express-VIs hierdurch ersetzen:
[attachment=26183]


Buffer läuft voll - B033el - 03.05.2010 15:33

Vielen dank wird direkt ausprobiertSmile

Mfg Michael


Buffer läuft voll - B033el - 03.05.2010 15:57

ich hab das mal versucht. (nur mit 1 channel)

Also erstens lese ich jetzt erst mal 9 Bytes ein und zieh dann meine Infos daraus.

Im Moment ist jetzt das Problem, dass ich immer nur einen Datenpunkt angezeigt bekommen (den aktuellen) und den immer bei t=0.

Muss ich meine Daten in ein Array schreiben ?? wenn ja hab ich das Problem dass ich vorher ja garnicht weiß wie groß dieses dann sein muss also wieviele daten ich aufnehme.

MfG Michael


Buffer läuft voll - jg - 03.05.2010 15:59

' schrieb:Die Daten schicke mit mit 9600 bits / s .
Also grob 1000 Ascii-Zeichen / s. Bei 3 Zeichen, die du ausliest, also 3 ms pro Lesevorgang. Damit läuft deine Lese-Loop also mit grob 330 Hz, und da du jedes diese jeweils 3 bytes auch in deiner Consumer-Loop einzeln ausliest, läuft auch die mit 330 Hz. Und sooft schreibst du auch was in die Graphen, das finde ich schon heftig.
' schrieb:Meinst du ich soll also mit einem VISA read gleich 9 Bytes einlesen und dann meine Infos daraus ziehen ?? geht das schneller als 3 x 3 zu lesen ?
Insgesamt natürlich nicht, die Senderate kommt schließlich von deinem µC, aber deine Lese-Loop würde "nur noch" mit 100 Hz laufen. Besser.

Wenn du dann noch in deiner Consumer-Loop die Eigenschaft der Queue ausnutzt und nicht jedes Element einzeln ausliest, sondern durch geschickte Verzögerung z.B. immer 10 Datensätze, dann könntest du diese Schleife z.B. auf ca. 10 Hz drücken, das langt für das Update der Graphen völlig aus. Dann noch Charts, wenn du auf die Zeit-Info verzichten kannst (Bemerkung: Die kommt momentan sowieso nicht korrekt in deiner Consumer-Loop an, zwecks Race-Condition durch deine lokale Variable), und das ganze sollte schon besser laufen.

Gruß, Jens


Buffer läuft voll - Lucki - 03.05.2010 18:00

' schrieb:Im Moment ist jetzt das Problem, dass ich immer nur einen Datenpunkt angezeigt bekommen (den aktuellen) und den immer bei t=0.
Du mußt natürlich die Waveform Chart (das Signalverlaufsdiagramm) nehmen und nicht den Waveform Graph