25.02.2009, 11:45
Beitrag #1
|
RomanT
LVF-Grünschnabel
Beiträge: 12
Registriert seit: Aug 2007
2011
2006
DE
Schweiz
|
Ende von VISA Read
Sali allerseits
Ich habe folgendes Problem: Ich erwarte auf der seriellen Schnittstelle ein Kommando beliebiger aber definierter maximaler Länge, welches mit einem Endzeichen abgeschlossen ist und zu einem beliebigen Zeitpunkt eintreffen kann. Dies liesse sich ganz einfach realisieren, wenn ich bei der Konfiguration der VISA-Schnittstelle das Timeout deaktivieren könnte. Mir scheint jedoch, dass dies nicht möglich ist. Bleibt also wirklich nur die Möglichkeit, die Daten byteweise einzulesen, in einem Schieberegister aneinander zu hängen und manuell auf das Endzeichen zu überprüfen?
Grüsse
Roman
|
|
|
25.02.2009, 11:57
Beitrag #2
|
eg
LVF-SeniorMod
Beiträge: 3.868
Registriert seit: Nov 2005
2016
2003
kA
66111
Deutschland
|
Ende von VISA Read
Am einfachsten, machst du einen Timeout (z.B. 1 Sekunde) und falls kein Timeout ist, dann Daten auswerten.
|
|
|
25.02.2009, 13:25
Beitrag #3
|
RomanT
LVF-Grünschnabel
Beiträge: 12
Registriert seit: Aug 2007
2011
2006
DE
Schweiz
|
Ende von VISA Read
' schrieb:Am einfachsten, machst du einen Timeout (z.B. 1 Sekunde) und falls kein Timeout ist, dann Daten auswerten.
Das verstehe ich nun nicht ganz. Das Kommando, welches ich erhalte, folgt nicht etwa auf einen Befehl hin, sondern zu einem beliebigen Zeitpunkt, nämlich wenn ein Benutzer eine Taste drückt. Das heisst, das VISA Read wird einfach mal irgendwann, in diesem Falle zu Programmbeginn, ausgeführt und irgendwann tritt dann das Timeout ein, wenn bis dahin noch nicht das Endzeichen empfangen wurde. Und wenn ich das richtig gesehen habe, liest ja VISA Read beim Timeout ebenfalls den Buffer aus. Das heisst, ich habe dann unter Umständen, nämlich wenn das Timeout mitten während einer Übertragung erfolgte, nur einen Teil des Kommandos am Ausgang von VISA Read und der Rest wird später in den Buffer geschrieben. Ich müsste dann also nochmals auslesen und die beiden Teile zusammensetzen. Oder sehe ich das falsch, und der Timeoutcounter wird bei Datenempfang zurückgesetzt und in der Folge tritt gar nie ein Timeout während dem Empfang von Daten auf?
|
|
|
25.02.2009, 13:35
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2009 13:51 von Lucki.)
Beitrag #4
|
Lucki
Tech.Exp.2.Klasse
Beiträge: 7.699
Registriert seit: Mar 2006
LV 2016-18 prof.
1995
DE
01108
Deutschland
|
Ende von VISA Read
Der Timout läßt sich war nicht deaktivieren, aber reichen Dir denn die 7 Wochen, die Du mit der U32-Zahl in der Visa-Konfiguration immerhin vorgeben kanns, wirklich nicht aus?
Bessere Alternative: Timout ca.1 sec, bei Timeout den Fehler abfangen und Lesen so lange in der Schleife wiederholen, bis die gewünschten Daten kommen. Vorteil: Man hat - bei entsprechender Programmierung - die Möglichket des Stops durch Bedieneingriff.
Edit:
Zitat:Und wenn ich das richtig gesehen habe, liest ja VISA Read beim Timeout ebenfalls den Buffer aus. Das heisst, ich habe dann unter Umständen, nämlich wenn das Timeout mitten während einer Übertragung erfolgte, nur einen Teil des Kommandos am Ausgang von VISA Read und der Rest wird später in den Buffer geschrieben. Ich müsste dann also nochmals auslesen und die beiden Teile zusammensetzen
Du scheinst nicht zu wissen, daß das Aufsammeln der Stringzeichen mittels Shift-Register in mehreren Schleifendurchläufen nun wirklich eine ganz leichte Übung ist. Brauchst Du dazu ein Beispiel? Und bei Ende des Timeout brauchst Du nicht zu befürchten, daß dabei ein gerade übertragenes Byte zerstört wird.
|
|
|
25.02.2009, 14:02
Beitrag #5
|
eg
LVF-SeniorMod
Beiträge: 3.868
Registriert seit: Nov 2005
2016
2003
kA
66111
Deutschland
|
Ende von VISA Read
Im Timeout-Fall Daten im Schieberegister mit String anhängen sammeln. Falls also kein Timeout Fehler kommt - Daten des Schieberegisters auswerten und leeren.
|
|
|
25.02.2009, 14:39
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2009 14:49 von Lucki.)
Beitrag #6
|
Lucki
Tech.Exp.2.Klasse
Beiträge: 7.699
Registriert seit: Mar 2006
LV 2016-18 prof.
1995
DE
01108
Deutschland
|
Ende von VISA Read
Vergiss alles bisher Gesagte, es gibt was Besseres.
Du aktivierst in der Konfiguration das Visa-Ereignis "Termchar" (Endezeichen) und wartest dann in einer Schleife auf das Ereignis. Bei Timeout wird erneut gewartet. Wenn es da ist, wird die Schleife verlassen und dann erst kommt VisaRead zum Zuge. Dann liest Du den String aus - fertig.
|
|
|
25.02.2009, 17:01
Beitrag #7
|
RomanT
LVF-Grünschnabel
Beiträge: 12
Registriert seit: Aug 2007
2011
2006
DE
Schweiz
|
Ende von VISA Read
' schrieb:Der Timout läßt sich war nicht deaktivieren, aber reichen Dir denn die 7 Wochen, die Du mit der U32-Zahl in der Visa-Konfiguration immerhin vorgeben kanns, wirklich nicht aus?
Bessere Alternative: Timout ca.1 sec, bei Timeout den Fehler abfangen und Lesen so lange in der Schleife wiederholen, bis die gewünschten Daten kommen. Vorteil: Man hat - bei entsprechender Programmierung - die Möglichket des Stops durch Bedieneingriff.
Edit:
Du scheinst nicht zu wissen, daß das Aufsammeln der Stringzeichen mittels Shift-Register in mehreren Schleifendurchläufen nun wirklich eine ganz leichte Übung ist. Brauchst Du dazu ein Beispiel? Und bei Ende des Timeout brauchst Du nicht zu befürchten, daß dabei ein gerade übertragenes Byte zerstört wird.
Dass das Zusammenfügen per Schieberegister eine einfache Sache ist, ist mir schon klar. Aber ich wollte dennoch wissen, ob es eine elegantere Lösung gibt. Aber anscheinend ist das doch die beste Lösung und ich werde das daher wohl so implementieren.
Danke euch.
|
|
|
26.02.2009, 10:34
Beitrag #8
|
|
|
26.02.2009, 12:10
|
RoLe
LVF-Guru
Beiträge: 1.236
Registriert seit: Jul 2007
-
1997
en
0
Schweiz
|
Ende von VISA Read
' schrieb:Das ist durchaus eine Möglichkeit. Aber einschalten des Termchar und dann mit "kleinen" Timeout lesen erscheint mir nicht so besonders schwierig. Je nach Instrument muss man halt schon mal einen bestimmten Fehler wie den Timeout Fehler filtern. Das ist doch nicht schlimm. Manche Leute hier scheinen einerseits den Error Cluster oft komplett zu vernachlässigen und/oder andererseits eine panische Angst zu haben wenn eine Funktion einen Fehler zurückgibt. Sicher bei Kommunikation mit externen Geräten ist es oft unvermeidbar, dass man manchmal Fehler erhält, die halt nicht wirklich Fehler sind sondern ganz einfach "Expected Behaviour". Filtern dieser Fehler ist dann ganz logisch und sinnvoll.
Das ist durchaus auch eine Möglichkeit
Ich finde auch, dass dies nicht schwierig ist und auch nicht schlimm, und bei mir hat jedes VI Error In/Out, auch wenn das VI gar keinen Fehler generieren kann. (Datenfluss)
Ich finde den TimeOut Fehler aber noch nützlich, um z.Bsp. eine Meldung auszugeben. (Ist das Kabel gesteckt?)
Ok, in dem Poster-Problem nützt das vermutlich nichts, da nicht bekannt ist, wann Daten kommen sollten.
Ich meinte auch bei meinem Vorschlag, dass der Termchar eingeschaltet ist, hätte ich schreiben sollen.
.·´¯)--> Leben ist das, was dir passiert, wenn du eifrig dabei bist andere Pläne zu machen <--(¯`·.
|
|
|
| |