(30.12.2011 00:50 )Erik_M schrieb: Hallo miteinander,
ich habe sehr wenig Erfahrung mit dem Zugreifen auf dlls in Labview.
Gerne möchte ich auf den Lightstone (USB Meßgerät vom Spiel Wild Divine, das den Hautwiderstand und
die Herzfrequenz und -variabilität misst) unter Labview zugreifen und die Daten erfassen.
Dazu gibt es liblightstone, ein Treiber (Cross-platform driver).
Hierzu habe ich die dll-, h-, und c-Dateien in der zip.Datei angefügt.
Unter:
http://docs.nonpolynomial.com/liblightst...ygen/html/
gibt es die Beschreibung der Daten Struktur, Kern Funktionen etc.
In der angefügten Test.vi habe ich erfolgreich die lightstone_create und lightstone_get_count Funktionen zum laufen bekommen.
Jedoch bei der lightstone_open Funktion zeigt der Rückgabetyp -3 an: E_LIGHTSTONE_NOT_OPENED
Bei der lightstone_get_info Funktion bleibt Labview hängen.
Muss man bei der lightstone_open Funktion unbedingt den lightstone* dev Parameter mit angeben (Datenfeld mit mehreren struct und int, welches mit der lighstone_create Funktion erstellt wurde)? Bei der lightstone_get_count Funktion war dies jedoch nicht erforderlich.
Bei der lightstone_get_info ist der Rückgabetyp ein array mit float,float. Wie erstelle ich die Verbindung zur Funktion?
Ist es erforderlich in der lightstone_get_info bei der Aufrufkonvention stdcall (WINAPI) anstatt c einzustellen?
Es wäre schön, wenn mir jemand hier helfen könnte.
M.f.G
Erik
Also so ist das aber wirklich völlig falsch. Die lighstone_create Function erzeugt eine Struktur und gibt den Pointer darauf zurück. Dieser Pointer muss dann an alle anderen Funktionen übergeben werden. Du kannst nicht einfach Funktionsparameter unterschlagen wenn Du eine Funktion aufrufst. Das hat beinahe zwingend eine Korruption des Stacks zur Folge und danach ist es schlicht grosses Unglück wenns nicht gleich crasht. Grosses Unglück weil Codeexecution mit korrumpiertem Stack sehr katastrophale Folgen haben kann bis hin zur Beschädigung des Betriebsystems.
Die lightstone_get_count Funktion hat eindeutige einen Parameter den Du einfach unterschlägst. Dass die damit etwas anderes dann 0 zurückgibt ist eher unwahrscheinlich. lightstone_open hat zwei Parameter. Der erste ist der Strukturpointer den die lightstone_create Funktion zurückgibt, der zweite ist der Index des Devices das geöffnect werden soll, und sollte wohl zwischen 0 und dem Rückgabewert -1 von lightstone_get_count liegen.
Wie also den Strukturpointer in LabVIEW behandeln? Ziemlich einfach. Konfigurierere den Rückgabewert von lightstone_create als Pointer sized Integer. Und bei allen anderen Funktionen die einen lightstone *dev Parameter haben konfigurierst Du diesen Parameter ebenso. Nun kannst Du den Ausgang von lightstone_create mit diesen anderen Paramtern verbinden. Und um ein Speicherleck zu vermeiden musst Du nicht vergessen lightstone_delete am Ende aufzurufen. ligtstone_create erzeugt im Speicher eine Struktur die ansonsten nicht wieder freigegeben wird.
Der Rückgabewert von ligtstone_get_info ist direkt in LabVIEW nicht auslesbar. LabVIEW akzeptiert nur Strings, und Skalars als Funktionsrückgabewerte. Bei einem String wird vom Startwert des Pointers so lange gesucht bis ein NULL Byte gefunden wird und das wird dann alles in einen LabVIEW String kopiert. Das heisst dass Du oftmals nicht alle 8 bytes der zwei Floats sehen würdest. Eine Möglichkeit besteht darin, diesen Parameter ebenfalls als Pointer sized Integer zu konfigurieren und dann mit Aufruf der MoveBlock LabVIEW C Funktion (suchen nach MoveBlock hier und bei forums.ni.com) die 8 Bytes in einen entsprechenden Cluster kopieren.
Und denke daran, wenn eine Funktion zwei Parameter hast musst Du in der Call Library Node auch wirklich zwei Parameter konfigurieren, keinen mehr oder weniger.