Velleman EDU05

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Velleman EDU05

Beitrag von GGStefan »

Hallo an alle,

ich würde gerne mein EDU05 (https://www.velleman.eu/products/view/?id=405282) verwenden und dazu mir ein eigenes Programm mit QT 5.4 erstellen. Bisher hatte ich immer von den Herstellern zum Einbinden eine LIB-Datei und die entsprechenden Header-Dateien. Velleman liefert ja nur eine DLL mit. Funktioniert es auch mit der DLL? Wenn ja wie?

GGStefan
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Velleman EDU05

Beitrag von Christian81 »

Header, Libs und eine API-Dokumentation sollten schon mitgeliefert werden, aber was hat das mt Qt zu tun?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Velleman EDU05

Beitrag von veeman »

Offensichtlich gibt es keine richtigen Header und Lib Dateien zu der Dll. Jedoch sind die Prototypen der Funktion bekannt, von daher kannst du diese Dynamisch laden und ausführen.
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Velleman EDU05

Beitrag von GGStefan »

Hallo Christian81,

das dachte ich auch, ist aber leider nicht so. Antwort von Support Velleman "I'm sorry, only the DLL available for the EDU05." Mit QT hat das nichts direkt zu tun!

Hallo veeman,

wie komme ich an die Prototypen und wie macht man das mit dem Dynamisch laden? Hast Du eventuell ein Beispiel dafür?

Gruß GGStefan
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Velleman EDU05

Beitrag von veeman »

In dem zur Verfügung gestellten Package findet man zum Beispiel folgende importtabelle die in Pascal geschrieben ist:

Code: Alles auswählen

function OpenDevice: integer; stdcall; external 'EDU05D.dll';
procedure CloseDevice; stdcall; external 'EDU05D.dll';
function Connected: boolean; stdcall; external 'EDU05D.dll';
function ReadAnalogChannel(Channel: integer):integer; stdcall; external 'EDU05D.dll';
function ReadAllDigital: integer; stdcall; external 'EDU05D.dll';
procedure SetPWM(Channel: integer; Data: integer); stdcall; external 'EDU05D.dll';
procedure InOutMode(IOMode: integer);stdcall;  external 'EDU05D.dll';
procedure OutputAllDigital(Data: integer);stdcall;  external 'EDU05D.dll';
procedure ClearAllDigital; stdcall; external 'EDU05D.dll';
procedure SetAllDigital; stdcall; external 'EDU05D.dll';
procedure ClearDigitalChannel(Channel: integer); stdcall; external 'EDU05D.dll';
procedure SetDigitalChannel(Channel: integer); stdcall; external 'EDU05D.dll';
procedure LCDInit; stdcall; external 'EDU05D.dll';
procedure LCDClear; stdcall; external 'EDU05D.dll';
procedure LCDWriteString(Data: PChar; Position: integer); stdcall; external 'EDU05D.dll';
procedure StartupDemo(onoff: integer); stdcall; external 'EDU05D.dll';
function ReadBackStartupDemo: boolean; stdcall; external 'EDU05D.dll';
Mit Hilfe dieser kannst du nun deine Funktionspointer in C/++ definieren und mittels LoadLibrary und GetProcAddress die Bibliothek laden.
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Velleman EDU05

Beitrag von GGStefan »

Hallo veeman,

danke für deine Hilfe, scheint aber für mich wohl ein wenig zu hoch zu sein. Da habe ich wohl Pech mit dem EDU05, wird wohl in die Kiste wandern und Gut ist. Was Velleman sich da unter einem USB Tutor Modul vorstellt ist wohl nicht ganz das was ich dachte, Schade.

Gruß GGStefan
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Velleman EDU05

Beitrag von veeman »

Na so schwer ist das nicht (nicht getestet):

EDU05.h

Code: Alles auswählen

#ifndef _EDU05D_H_
#define _EDU05D_H_

bool eduInitLibrary();

int eduOpenDevice();
void eduCloseDevice();
bool eduConnected();
int eduReadAnalogChannel(int Channel);
int eduReadAllDigital();
void eduSetPWM(int Channel, int Data);
void eduInOutMode(int IOMode);
void eduOutputAllDigital(int Data);
void eduClearAllDigital();
void eduSetAllDigital();
void eduClearDigitalChannel(int Channel);
void eduSetDigitalChannel(int Channel);
void eduLCDClear();
void eduLCDWriteString(char *PData, int Position);

#endif // _EDU05D_H_
EDU05.cpp

Code: Alles auswählen

#include <Windows.h>
#include "EDU05D.h"

typedef int(__stdcall *POpenDevice)();
typedef void(__stdcall *PCloseDevice)();
typedef bool(__stdcall *PConnected)();
typedef int(__stdcall *PReadAnalogChannel)(int Channel);
typedef int(__stdcall *PReadAllDigital)();
typedef void(__stdcall *PSetPWM)(int Channel, int Data);
typedef void(__stdcall *PInOutMode)(int IOMode);
typedef void(__stdcall *POutputAllDigital)(int Data);
typedef void(__stdcall *PClearAllDigital)();
typedef void(__stdcall *PSetAllDigital)();
typedef void(__stdcall *PClearDigitalChannel)(int Channel);
typedef void(__stdcall *PSetDigitalChannel)(int Channel);
typedef void(__stdcall *PLCDClear)();
typedef void(__stdcall *PLCDWriteString)(char *PData, int Position);

POpenDevice pOpenDevice = 0;
PCloseDevice pCloseDevice = 0;
PConnected pConnected = 0;
PReadAnalogChannel pReadAnalogChannel = 0;
PReadAllDigital pReadAllDigital = 0;
PSetPWM pSetPWM = 0;
PInOutMode pInOutMode = 0;
POutputAllDigital pOutputAllDigital = 0;
PClearAllDigital pClearAllDigital = 0;
PSetAllDigital pSetAllDigital = 0;
PClearDigitalChannel pClearDigitalChannel = 0;
PSetDigitalChannel pSetDigitalChannel = 0;
PLCDClear pLCDClear = 0;
PLCDWriteString pLCDWriteString = 0;

bool eduInitLibrary()
{
   HMODULE hMod = LoadLibrary(TEXT("edu05d.dll"));

   if (hMod)
   {
      pOpenDevice = (POpenDevice)GetProcAddress(hMod, "OpenDevice");
      pCloseDevice = (PCloseDevice)GetProcAddress(hMod, "CloseDevice");
      pConnected = (PConnected)GetProcAddress(hMod, "Connected");
      pReadAnalogChannel = (PReadAnalogChannel)GetProcAddress(hMod, "ReadAnalogChannel");
      pReadAllDigital = (PReadAllDigital)GetProcAddress(hMod, "ReadAllDigital");
      pSetPWM = (PSetPWM)GetProcAddress(hMod, "SetPWM");
      pInOutMode = (PInOutMode)GetProcAddress(hMod, "InOutMode");
      pOutputAllDigital = (POutputAllDigital)GetProcAddress(hMod, "OutputAllDigital");
      pClearAllDigital = (PClearAllDigital)GetProcAddress(hMod, "ClearAllDigital");
      pSetAllDigital = (PSetAllDigital)GetProcAddress(hMod, "SetAllDigital");
      pClearDigitalChannel = (PClearDigitalChannel)GetProcAddress(hMod, "ClearDigitalChannel");
      pSetDigitalChannel = (PSetDigitalChannel)GetProcAddress(hMod, "SetDigitalChannel");
      pLCDClear = (PLCDClear)GetProcAddress(hMod, "LCDClear");
      pLCDWriteString = (PLCDWriteString)GetProcAddress(hMod, "LCDWriteString");

      if (pOpenDevice &&
          pCloseDevice &&
          pConnected &&
          pReadAnalogChannel &&
          pReadAllDigital &&
          pSetPWM &&
          pInOutMode &&
          pOutputAllDigital &&
          pClearAllDigital &&
          pSetAllDigital &&
          pClearDigitalChannel &&
          pSetDigitalChannel &&
          pLCDClear &&
          pLCDWriteString)
         return true;
   }

   return false;
}

int eduOpenDevice() 
{ 
   if (pOpenDevice)
      return pOpenDevice();
   return 0;
}

void eduCloseDevice()
{ 
   if (pCloseDevice)
      pCloseDevice();
}

bool eduConnected()
{ 
   if (pConnected)
      return pConnected();
   return false;
}

int eduReadAnalogChannel(int Channel)
{ 
   if (pReadAnalogChannel)
      return pReadAnalogChannel(Channel);
   return 0;
}

int eduReadAllDigital()
{
   if (pReadAllDigital)
      return pReadAllDigital();
   return 0;
}

void eduSetPWM(int Channel, int Data)
{ 
   if (pSetPWM)
      pSetPWM(Channel, Data);
}

void eduInOutMode(int IOMode)
{ 
   if (pInOutMode)
      pInOutMode(IOMode);
}

void eduOutputAllDigital(int Data)
{
   if (pOutputAllDigital)
      pOutputAllDigital(Data);
}


void eduClearAllDigital()
{
   if (pClearAllDigital)
      pClearAllDigital();
}


void eduSetAllDigital()
{
   if (pSetAllDigital)
      pSetAllDigital();
}


void eduClearDigitalChannel(int Channel)
{
   if (pClearDigitalChannel)
      pClearDigitalChannel(Channel);
}


void eduSetDigitalChannel(int Channel)
{
   if (pSetDigitalChannel)
      pSetDigitalChannel(Channel);
}

void eduLCDClear()
{
   if (pLCDClear)
      pLCDClear();
}


void eduLCDWriteString(char *PData, int Position)
{
   if (pLCDWriteString)
      pLCDWriteString(PData, Position);
}
Verwendung:

Code: Alles auswählen

    if (eduInitLibrary())
    {
       if (eduOpenDevice())
       {
          eduLCDWriteString("Hello World", 0);
          eduCloseDevice();
       }
    }
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Velleman EDU05

Beitrag von GGStefan »

Hallo veeman,

vielen Dank für die tolle Unterstützung, werde es so schnell wie möglich testen und berichten. Vielen Dank :D
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Velleman EDU05

Beitrag von GGStefan »

Hallo veeman,

habe endlich die Zeit gefunden es zu testen, funktioniert soweit richtig gut. Habe noch nicht alle Funktionen durch getestet aber wird schon funktionieren. Durch das einbinden von "windows." und das verwenden der DLL ich gehe ich davon aus das dieses jetzt nur unter Windows funktioniert. Gibt es auch eine Möglichkeit das unter Linux/Ubuntu benutzen zu können, aber ohne Wine oder so.

Gruß GGStefan
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Velleman EDU05

Beitrag von veeman »

Naja die DLL wirst du wohl nicht ohne weiteres unter Linux verwenden können.

Wenn du Glück hast dann wird die USB Verbindung über einen virtuellen COM Port gelöst, dann könnte man die gesendeten Daten unter Windows sniffen und eine eigene Bibliothek nachbauen.
Die Frage ist halt ob man Lust darauf hat und ob es sich der aufwand lohnt.
GGStefan
Beiträge: 22
Registriert: 31. August 2012 23:59
Wohnort: Brandenburg (LDS)

Re: Velleman EDU05

Beitrag von GGStefan »

Hallo veeman,

ich denke wohl eher nicht, hätte ich das vorher gewusst hätte ich das Teil nicht gekauft. Den als Modul zum erlernen der USB-Kommunikation taugt das eher nicht.
Aber vielen Dank noch einmal für Deine Hilfe. :P

Gruß GGStefan
Antworten