Re: Probleme beim Debuggen
From: Foxi (vokuit00_at_service-profis.de)
Date: 07/07/04
- Next message: Xaver Trapichler: "index.html im Unterordner"
- Previous message: Andreas Born: "Re: Ameisen"
- In reply to: Peter Götz: "Re: Probleme beim Debuggen"
- Messages sorted by: [ date ] [ thread ]
Date: 6 Jul 2004 22:18:51 -0700
:-)) Mein Gott, das ihr alles so genau wissen müßt :-))
Also es geht um eine CANCardXL der Firma Vector Informatik. Ein Kanal
dieser Karte ist mit einem CAN-Bus verbunden und empfängt dort
CAN-Botschaften von KFZ-Steuergeräten. Der zweite Kanal ist eine
Digital/Analog-Ein-/Ausgangskarte und mißt verschiedene Signale von
diesen Steuergeräten.
In C habe ich die Funktionen von VB, die via Callback aufgerufen
werden sollen als typedef wie folgt ausgeführt:
// Callback-Funktion, um empfangene Messages an VB zu übergeben
typedef void (__stdcall *sendMessage) (struct s_xl_can_msg *,
unsigned __int64 *);
// Callback-Funktion um Probleme an VB weiterzumelden
typedef void (__stdcall *VektorProblem) (int problem);
// Callback-Funktion, um gemessene DAIO-Daten an VB zu übergeben
typedef void (__stdcall *sendDAIO) (struct s_xl_daio_data *, unsigned
__int64 *);
und nun laufen in der C-DLL zwei Threads, die beim eintreffen von
neuen Nachrichten (CAN) bzw. zyklisch (Digital/Analog) die jeweilige
Funktion von VB aufrufen:
DWORD WINAPI CANEmpfangsThread(LPVOID par)
{
XLstatus xlstatus;
unsigned int counter = RECEIVE_EVENT_SIZE;
XLevent xlEvent;
g_CANLeseThreadBeendet = CreateEvent(NULL, FALSE, FALSE, NULL);
ResetEvent(g_CANLeseThreadBeendet);
while (g_CANLeseThreadRun)
{
_RPT0(0,"In der THREAD-SCHLEIFE\n");
// warten bis eine CAN-Botschaft eingeht, max. 1000 ms
WaitForSingleObject(g_hCANEvent,1000 );
if (g_CANLeseThreadRun == 0)
_RPT0(0, "Nach Wait.., Flag ist nun 0\n");
counter = RECEIVE_EVENT_SIZE;
xlstatus = xlReceive(g_portHandleCAN, &counter, &xlEvent);
if (g_CANLeseThreadRun == 0)
_RPT0(0, "Nach erstem Receive, Flag ist nun 0\n");
// Hier noch die Callback-Funktion von VB mit der Message
aufrufen, wenn MSG nicht leer
if (xlstatus == XL_SUCCESS)
{
_RPT0(0,"1. MESSAGE EMPFANGEN\n");
if (xlEvent.tag == XL_RECEIVE_MSG &&
xlEvent.tagData.msg.flags != XL_CAN_MSG_FLAG_TX_COMPLETED)
{
if (g_CANLeseThreadRun == 0)
_RPT0(0, "Vor Aufruf, Flag ist nun 0\n");
g_Adress_of_Callback_CAN_Messages (&xlEvent.tagData.msg,
&xlEvent.timeStamp);
if (g_CANLeseThreadRun == 0)
_RPT0(0, "Nach Aufruf, Flag ist nun 0\n"); }
}
while (!xlstatus && g_CANLeseThreadRun)
{
XLevent xlevent;
_RPT0(0,"In der While-Schleife\n");
// Wenn noch Messages in der Queue sind, dann diese abholen
// Hier sollen alle Messages aus der Queue abgeholt werden,
damit
// der Event wieder gelöscht wird
counter = RECEIVE_EVENT_SIZE;
xlstatus = xlReceive(g_portHandleCAN , &counter, &xlevent);
if (xlevent.timeStamp != xlEvent.timeStamp)
{
// Hier noch die Callback-Funktion von VB mit der Message
aufrufen, wenn MSG nicht gleich der Vorhergehenden
if (xlEvent.tag == XL_RECEIVE_MSG &&
xlevent.tagData.msg.flags != XL_CAN_MSG_FLAG_TX_COMPLETED)
{
if (g_CANLeseThreadRun == 0)
_RPT0(0, "Vor Aufruf, Flag ist nun 0\n");
g_Adress_of_Callback_CAN_Messages
(&xlEvent.tagData.msg, &xlEvent.timeStamp);
if (g_CANLeseThreadRun == 0)
_RPT0(0, "Nach Aufruf, Flag ist nun 0\n");
}
}
}
}
_RPT0(0,"CAN-Empfangs-Thread-Schleife verlassen\n");
SetEvent (g_CANLeseThreadBeendet);
return NO_ERROR;
}
DWORD WINAPI DAIOLesenThread(LPVOID par)
{
XLstatus xlstatus;
unsigned int msgsrx = RECEIVE_EVENT_SIZE;
XLevent actualxlevent;
// Event einrichten, der ein Ende des Threads signalisiert
g_DAIOLeseThreadBeendet = CreateEvent(NULL, FALSE, FALSE, NULL);
g_DAIOLeseThreadRun = 1;
while (g_DAIOLeseThreadRun)
{
WaitForSingleObject(g_hDAIOEvent,INFINITE);
xlstatus = xlReceive ( g_portHandleDAIO, &msgsrx,
&actualxlevent);
g_Adress_of_Callback_DAIO_Measurements(&actualxlevent.tagData.daioData,
&actualxlevent.timeStamp);
}
// Signal für das Ende des Threads setzen
_RPT0(0,"DAIO-Empfangs-Thread-Schleife verlassen\n");
SetEvent (g_DAIOLeseThreadBeendet);
return NO_ERROR;
}
In VB habe ich nun zwei simple Funktionen, die via Callback aufgerufen
werden:
Public Sub CallbackCAN(ByRef msg As CanMessage, ByRef timestamp As
Currency)
If (frmMain.lstCAN.ListCount < 2000) Then
frmMain.lstCAN.AddItem (CStr(msg.id) & vbTab & "Flag:" &
CStr(msg.flags) & vbTab & CStr(timestamp))
Else
frmMain.lstCAN.RemoveItem (1)
frmMain.lstCAN.AddItem (CStr(msg.id) & vbTab & "Flag:" &
CStr(msg.flags) & vbTab & CStr(timestamp))
End If
End Sub
Public Sub CallbackDAIO(ByRef msg As DAIOMessage, ByRef timestamp As
Currency)
If (frmMain.lstDAIO.ListCount < 20) Then
frmMain.lstDAIO.AddItem (CStr(msg.analog(2)))
Else
frmMain.lstDAIO.RemoveItem (1)
frmMain.lstDAIO.AddItem (CStr(msg.analog(2)))
End If
End Sub
Aber selbst wenn ich die DAIO (Digital-Analog-Input-Output)-Funktion
wie folgt ändere:
Public Sub CallbackDAIO(ByRef msg As DAIOMessage, ByRef timestamp As
Currency)
End Sub
- Next message: Xaver Trapichler: "index.html im Unterordner"
- Previous message: Andreas Born: "Re: Ameisen"
- In reply to: Peter Götz: "Re: Probleme beim Debuggen"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|