Hallo Tim,
(14.04.2012 07:49 )Tintin schrieb: Ich mache es ja jetzt so, dass ich die VISA-Ressource einmal global öffne, und dann für jeden Kanal in einer separaten Schleife den Messwert abfrage. Angenommen, ich frage einmal Kanal 1 ab, indem ich zunächst mittels VISA-Write den Abfragebefehl ans Messgerät schicke und anschließend mittels VISA-Read den Messwert lese. Dann - so meine Vermutung - wird wohl zwischen diesen beiden Befehlen der VISA-Read Befehl von Kanal 2 ausgeführt und der angefragte Messwert von Kanal 1 irrtümlicherweise Kanal 2 zugeordnet. Gibt es eine Möglichkeit, dieses "Dazwischenfunken" zu verhindern? Müsste man dafür die Abfrage der einzelnen Kanäle nicht in separaten Schleifen durchführen, sondern sequentiell in einer einzigen Schleife?
Wenn Du an unterschiedlichen Stellen im Programm auf die Serielle Schnittstelle schreibst und liest, dann kannst Du nie mit Gewissheit sagen, ob ein Programmteil bereits etwas geschrieben hat und Daten in den Empfangspuffer geschrieben werden, die dann vom falschen Programmcode gelesen werden.
Das ist im Prinzip auch eine Race Condition. Abhilfe kannst Du unterschiedlich schaffen. Entweder Du verwendest Semaphoren, löst es mit einer Action Engine oder denkst Dir etwas anderes abenteuerliches aus. Je nachdem welche und wieviele Daten da gelesen werden, könnte es auch eine ganz andere Lösung geben.
(14.04.2012 07:49 )Tintin schrieb: Außerdem hab ich keine Ahnung, welchen Wert ich als Read-Bytes der VISA-Read-Funktion verwenden muss. Mir ist nur bekannt, dass das Messgerät 8 Datenbits und einen Stoppbit verwendet. Trial-and-error hat ergeben, dass bei weniger als 9 Read-Bytes der empfangene String abgeschnitten wird. Aber gibt es allgemein eine Möglichkeit herauszufinden, welche Anzahl an Read-Bytes einzustellen ist?
Hast Du keine Beschreibung zu dem Gerät, mit dem Du kommunizierst? Das hängt ja letzlich davon ab, wieviele Daten gesendet werden.
(14.04.2012 07:49 )Tintin schrieb: ... Du nutzt einen Eigenschaftsknoten, um die Anzahl der am Port vorhandenen Bytes auszulesen. Falls bei "open" welche vorhanden sind, löschst Du diese (wieso?).
Da mein Gerät kontinuierlich Messdaten sendet (wenn es konfiguriert ist), und ich bei der Initialisierung der Schnittstelle nicht weiß, ob ich das gerade während einer Datenübertragung mache, werden die Daten im Empfangspuffer in diesem Fall gelöscht, da ich einen vollständigen Datensatz haben möchte.
(14.04.2012 07:49 )Tintin schrieb: Bei "aquire" liest Du ebenfalls die Anzahl der Bytes am Port aus, und falls diese einen Grenzwert erreichen, führst Du VISA-Read aus und akquirierst die Daten. Ist es nach jedem VISA-Read-Befehl nicht notwendig, die Bytes am Port zu löschen oder geschieht das automatisch?
Die Bytes verschwinden mit dem Lesebefehl aus dem Eingangspuffer und müssen nicht separat gelöscht werden.
(14.04.2012 07:49 )Tintin schrieb: Bevor Du VISA-Close ausführst, löschst Du ebenfalls nochmals alle Bytes am Port. Ist das zwingend notwendig?
Nein. Das ist nicht notwendig.
Viele Grüße
Andreas