LabVIEWForum.de - Datenkommunikation mit µC

LabVIEWForum.de

Normale Version: Datenkommunikation mit µC
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,
ich bin gerade dabei, eine Datenübertragung zw. LV (2009) und einem µC zu realisieren.

Zu Anfang etwas ganz einfaches:
LV sendet ein Zeichen (ein Byte) an den µC, der µC antwortet darauf hin mit einem simulierten Messwert (ein Byte) und wartet auf das nächste Zeichen von LV, antwortet wieder usw.
Nach jedem Durchlauf macht LV eine kleine Pause von 1 ms.

Soweit scheint alles zu funktionieren.

Aber: wenn das Programm so einige Minuten läuft und ich am µC der Rest-Knopf drücke und festhalte, so hört der µC ja auf zu senden.
Aber LV empfängt (scheinbar) noch einige Zeit (2-3 Sekunden) weiter Daten bzw. zeigt eben noch einen Datenstrom an, obwohl der µC gar nicht mehr reagiert.
Woher bekommt LV diese Daten ?

Im Anhang habe ich einmal das VI gepackt.

Vielen Dank für die Hilfe,
Herby
Der Empfangsbuffer ist z.B 1 kByte groß. Du sendest ein Zeichen an den PC und liest anschließend sofort ein Zeichen aus dem Empfangspuffer. Das kann gut gehen, aber falls der µC mal ein paar Zeichen zu viel gesendet hat, wird der Empfangspuffer nie mehr leer und das Byte welches du empfängst ist nicht das was der µC als Antwort gesendet hat. Bist Du Dir denn sicher, daß der µC nur ein Byte sendet, oder schickt er z.B immer noch ein Abschlußzeichen hinterher?

Wenn es aber nur 1 Byte ist, dann mach einfach folgendes:
Vor dem Aufruf zum PC senden füge das VI "VISA IO Puffer leeren" ein und leere den Empfangspuffer vor jedem µC-Aufruf.
Wenn das nicht hilft --> melde Dich.
Hallo Lucki,
die Sache mit dem Empfangspuffer ist mir auch schon durch den Kopf gegangen.
Da ich aber den µC auch selber programmiere, ist wirklich sicher gestellt, daß er nur ein Zeichen sendet.

Und da das Ganz ja wie im Ping-Pong-Verfahren abläuft, kann im Empfangsbuffer wirklich nur immer ein Zeichen stehen und der Buffer eigentlich nie überlaufen !

Ist denn mit dem VI so alles in Ordnung (ich arbeite erst seit ca. 6 Wochen intensiv mit LV) ?

Vielen Dank,
Herby
Hallo Lucki,
das mit dem "VISA I/O Puffer leeren" scheint zu funktionieren.

Ich habe auch einmal überprüft, ob wirklich nicht mehr Zeichen vom µC gesendet werden:
dazu habe ich bei der Funktion "VISA lesen" einfach die Byte-Anzahl, die eingelesen werden soll von 1 auf 2 erhöht.
Dann müßte das Programm ja auch laufen, wenn mehr als ein Byte empfangen wird.
Das war aber nicht der Fall: LV hat sich dabei mit einem Time-Out-Fehler gemeldet, daß das zweite Byte eben nicht angekommen ist.
Es wird also wirklich nur ein Byte vom µC gesendet und auch von LV empfangen.

Warum dann aber nach einiger Zeit der Puffer aufgefüllt wird, ist mir ein Rätsel.

Kann man sich unter LV den gesamten Puffer ansehen ?

Wenn ich im Blockdiagramm mit einer Sonde an den Read Buffer - Ausgang von "VISA:lesen" gehe, seh ich immer nur daß wirklich auch nur eine Byte im Buffer steht.

Vielen Dank
Herby
Ist das Vi in Ordnung? im Prinzip ja.
Kritikpunkte:
Das Umwanden des 1-Zeichen String in ein Byte ist etwas zu umständlich geraten, so geht es auch:
[attachment=31672]
Ein Übertragungsfehler kann schon mal vorkommen. ich würde einen auftretenden Fehler lieber so behandeln, daß dann die empfangenen Daten ignoriert werden, aber nicht dass das ganze VI deswegen gestoppt wird oder ein Dialog geführt werden muß.
Bei der Initialisierung der Schnittstelle sollt TermChar deaktiviert sein. Defaultmäßig ist das nicht der Fall.

Andere Methode das Einlesens: Nicht den Einganspuffer löschen, sondern:
Befehl an µC senden
Einige ms warten, (bis Antwort da sein müßte)
Anzahl der Bytes im Buffer feststellen (mit VISA Bytes am seriellen Port)
Die gefunden Anzahl an Visa Read anschließen und alle Bytes auslesen.

Wichtig: Die Anzahl überwachen. Sollte die Anzahl manchmal ungleich 1 sein, dann ganz großen Alarm auslösen und analysieren warum und wieso.
Hallo Lucki,

die Umwandlung String in Byte werde ich ändern.

Ich nehme an, mit TermChar meinst Du das Abschlußkennzeichen bei der Datenübertragung.
Die Überprüfung darauf habe ich aber deaktiviert, so brauche ich dort eigentlich nichts anzugeben.

Die Überprüfung von DÜ-Fehlern werde ich noch optimieren.
Mir ging es zur Zeit nur darum, zu klären, wo die "Phantom-Daten" herkommen.
Der µC sendet definitiv wirklich nur ein Byte aus.

Ich habe jetzt einmal beide VIs laufen lassen:

Beim VI OHNE Puffer-Löschung erhalte ich nach ca. 1 Stunde die Fehlermeldung, daß "irgendetwas" übergleaufen ist, daß Zeichen nicht rechtzeitig abgeholt worden sind.

Das VI MIT Puffer-Löschung läuft zur Zeit problemlos im Dauerbetrieb.

Ich werde aber auch noch einmal die Sache mit der aktuellen Puffer-Größen-Überprüfung durchführen.

Vielen Dank erst einmal für Dein Tipps !!Rolleyes

Herby
Den Langzeittest mit Puffer entleeren würde ich noch so modifizieren:
[attachment=31680]
Vor dem Kommando werden die Bytes at Port festgestellt und gegebenenfalls gelesen. Die eigentlich nicht sein dürfenden Bytes werden alle in einem Array gesammelt und stehen für Analysezwecke zur Verfügung.
Es war ein Versehen von mir, daß die Funktion "Puffer entleeren" im Bild noch drin ist. Der Puffer ist ja durch das vorangegangene Auslesen aller Bytes bereits geleert.
Man kann es auch so machen, daß man den Case an "Bytes at Port" anschließt und "Visa Read" nur bei >0 Bytes ausführt:
[attachment=31682]
Referenz-URLs