' schrieb:Klingt ziemlich korrek. Ich würde in sendresponse() auch die Callbackfunktion selber installieren und falls möglich einen weiteren Boolean Parameter vorsehen um diese auch wieder zu deinstallieren.
Rolf Kalbermatter
Hallo Rolf,
du glaubst ja gar nicht, wie sehr du mir geholfen hast :Dunglaublich - es funktioniert fast. d.h. ich mach das jetzt genau so wie besprochen.
ein problem habe ich aber noch - der event wird in der richtigen frequenz ausgelöst und daten werden übertragen, aber anscheinend wird der Buffer nicht korrekt aktualisiert, d.h. die der string ändert sich nicht. zuerst hatte ich die befürchtung, dass das memcpy bei abgebrochen wird (da die daten ca. so aussehen 01 41 00 00 09 01..). aber die funktion kopiert ja wirklich alles zum LVbuffer.
die buffer die ich verwende sind ja auch globale variablen in meine dll, deshalb habe ich mir gedacht, dass das schon so passt, oder muss ich von LabVIEW aus einen cstring zeiger mit der gewünschten adresse an meine dll übergeben und dort die daten hineinschreiben?
Danke für die Hilfe
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>// antwrapper.cpp : Definiert die exportierten Funktionen für die DLL-Anwendung.
//
#include "stdafx.h"
#include "stdio.h"
#include "extcode.h" //LabVIEW inlcude
//Definitionen der Laenge für die Buffer
#define EVENT_LAENGE 10
#define RESPONSE_LAENGE 5
//Typendifinitionen für die ANT Funktionen
typedef BOOL (*ptreventfunction)(UCHAR ucChannel, UCHAR ucEvent);
typedef BOOL (*ptrresponsefunction)(UCHAR ucChannel, UCHAR ucMsgId);
typedef void (*ANT_RESPONSE_POINTER)(ptrresponsefunction, UCHAR*);
typedef void (*ANT_EVENT_POINTER)(UCHAR, ptreventfunction, UCHAR*);
//ANT Buffer & Globals
UCHAR aucResponseBuffer[5]={};
UCHAR aucChannelEventBuffer[10]={};
LVUserEventRef *eventref;
LVUserEventRef *responseref;
LStrHandle eventStringHandle;
LStrHandle responseStringHandle;
BOOL ANT_ChannelEventFunction(UCHAR ucChannel, UCHAR ucEvent);
BOOL ANT_ResponseFunction(UCHAR ucChannel, UCHAR ucMsgId);
extern "C" __declspec(dllexport) int ANT_LabVIEW_Schnittstelle(LVUserEventRef *eventrefLabVIEW, LVUserEventRef *responserefLabVIEW, UCHAR antChannel)
{
int ok = 0;
//Übergaben von den LabVIEWRefs an Globale Variable
eventref=eventrefLabVIEW;
responseref=responserefLabVIEW;
//Eventstringhandle Speicher zuweisen
// Allocate LabVIEW User Event Data
responseStringHandle=(LStrHandle)DSNewHandle(sizeof(int32)+RESPONSE_LAENGE*sizeo
(UCHAR));
LStrLen(*responseStringHandle)=RESPONSE_LAENGE;
eventStringHandle=(LStrHandle)DSNewHandle(sizeof(int32)+EVENT_LAENGE*sizeof(UCHA
));
LStrLen(*eventStringHandle)=EVENT_LAENGE;
//Zeiger auf die ANT_Funktionen definieren
ANT_RESPONSE_POINTER ANT_AssignResponseFunction;
ANT_EVENT_POINTER ANT_AssignChannelEventFunction;
//ANT_DLL laden
HINSTANCE hANTdll = LoadLibraryA("ANT_DLL.dll");
if (hANTdll != NULL){
//Pointer auf die Funktionen setzen
ANT_AssignResponseFunction = (ANT_RESPONSE_POINTER) GetProcAddress(hANTdll, "_ANT_AssignResponseFunction");
ANT_AssignChannelEventFunction = (ANT_EVENT_POINTER) GetProcAddress(hANTdll, "_ANT_AssignChannelEventFunction");
}
//Funktionen aufrufen
if(ANT_AssignResponseFunction != NULL && ANT_AssignChannelEventFunction != NULL)
{
ANT_AssignResponseFunction((ptrresponsefunction)ANT_ResponseFunction, aucResponseBuffer);
ANT_AssignChannelEventFunction(antChannel, (ptreventfunction)ANT_ChannelEventFunction, aucChannelEventBuffer);
ok=1;
}
else
ok=0;
//ANT_DLL freigeben
FreeLibrary(hANTdll);
return ok;
}
//ChannelEventFunction
BOOL ANT_ChannelEventFunction(UCHAR ucChannel, UCHAR ucEvent)
{
//ANT Event Daten --> LabVIEWstring
memcpy((char*)LStrBuf(*eventStringHandle), &ucChannel, 1);
memcpy((char*)LStrBuf(*eventStringHandle)+1, &ucEvent, 1);
memcpy((char*)LStrBuf(*eventStringHandle)+2, &aucChannelEventBuffer,strlen(aucChannelEventBuffer)+1);
//Stringhandle an LabVIEW
PostLVUserEvent(*eventref, (void*)&eventStringHandle);
return TRUE;
}
//ResponseFunction
BOOL ANT_ResponseFunction(UCHAR ucChannel, UCHAR ucMsgId)
{
//ANT Response Daten --> LabVIEWstring
memcpy((char*)LStrBuf(*responseStringHandle), &ucChannel, 1);
memcpy((char*)LStrBuf(*responseStringHandle)+1, &ucMsgId, 1);
memcpy((char*)LStrBuf(*responseStringHandle)+2, &aucResponseBuffer, strlen(aucResponseBuffer)+1);
//Post event to Event structure
PostLVUserEvent(*responseref,(void*)&responseStringHandle);
return TRUE;
}</div>