Ansteuerung von Hardware aus C++



  • Hallo,

    ich hab mich jetzt schon stundenlang durchs Forum gelesen und nichts passendes finden können. Ich hoffe, Ihr könnt mir trotzdem weiterhelfen.

    Ich habe folgendes Problem:
    Ich möchte ein DMD-Controllerboard mit Hilfe von C++ programmieren. Dazu habe ich von Hersteller eine .dll, eine .lib (sowohl 32 als auch 64bit) und eine Header Datei.

    Folgendes habe ich bereits durchgeführt:
    1. Die Headerdatei habe ich zu Beginn des Projekts included
    2. Das Include-Verzeichnis habe ich in den Projekteinstellungen bekannt gemacht
    3. Das Verzeichnis der .lib habe ich im Linker bekanntgemacht
    4. Die .lib habe ich in den Linker Einstellungen hinzugefügt
    5. Die .dll habe ich in sämtliche Verzeichnisse des Projekts kopiert
    6. Ich habe eine Paar sehr einfache Zeilen Code geschrieben, ob meine Einstellungen korrekt sind.
    Hier der Code:
    [img=http://www.abload.de/thumb/code6n10.png]
    7. Hier die Beschreibung einiger Funktionen aus der API-Dokumentation
    http://www.abload.de/thumb/apisnjl.png

    Nun die Fragen.
    1. Ich nutze Windows 7 64bit. Ist die 32bit lib auf Grund der 32bit Konsolenanwedung korrekt?
    2. Beim Kompilieren des oben stehenden Codes, tritt folgende Fehlermeldung auf:
    http://www.abload.de/thumb/fehlerhn1r.png
    Was mache ich falsch?

    Ich hoffe, Ihr könnt mir helfen

    Gruß Jörg



  • Sorry, hier die richtige Funktion aus der Dokumentation:
    [img=http://www.abload.de/thumb/fehler2vnzi.png]



  • Deni1986 schrieb:

    2. Beim Kompilieren des oben stehenden Codes, tritt folgende Fehlermeldung auf:
    http://www.abload.de/thumb/fehlerhn1r.png

    ich seh' nur Apfelwerbung

    Deni1986 schrieb:

    Was mache ich falsch?

    Du hast die Fehlermeldung hier nicht gepostet



  • Sehr merkwürdig.. Naja, hier nochmal 😉

    http://hs1.abload.de/img/fehlerhn1r.png

    Gruß Jörg



  • Deni1986 schrieb:

    Sehr merkwürdig.. Naja, hier nochmal 😉

    http://hs1.abload.de/img/fehlerhn1r.png

    Gruß Jörg

    die eine Zeile hättest Du als Text doch einfach hier posten können. Warum der Umweg über Bild und Link?
    Wenn Du die Herstellerlib wirklich hinzugefügt hat (siehe Punkt4), dann ist die Funktion NumberOfDevices in der Lib nicht verfügbar.
    Öffne die DLL mit dem Dependencie-Walker und schaue nach.

    Passen Release und Debug? - vielleicht hast Du nur unter Debug eingefügt und Release ge'buildet'



  • Ichh abe gerade versucht die .lib von der Hersteller CD zu öffnen. Dabei kommt folgende Fehlermeldung:
    http://www.abload.de/img/depwalkerwm9k.png

    Den Umweg über die Bilder nehme ich, da mir dadurch nicht die Formatierung verloren geht. Ich denke sie wie es Visual Studio ausgibt ist es schon am übersichtlichsten. Zudem ist ein kleines <100kb File doch nun wirklich sehr schnell geladen 😉

    Ich habe die Einstellungen für alle Konfigurationen (Reiter "All Configurations") vorgenommen

    Gruß Jörg



  • Helfer schrieb:

    Öffne die DLL mit dem Dependencie-Walker und schaue nach.



  • Tut mir leid, zu schnell gelesen. Habe jetzt die DLL geöffnet. Die Funktion steht drin, allerdings zeigt er mir auch an, dass zwei benötigte DLL-Dateien fehlen...

    Hier die Ausgabe:
    http://www.abload.de/img/depwalker6hfm.png

    Gruß Jörg



  • Die AlligatorDLL ist vermutlich eine C und nicht C++ Lib. Der C++-Compiler muss dass wissen. Dazu werden normalerweise im Headerfile die C-Funktionen in ein

    #ifdef __cplusplus
    extern "C" {
    #endif
    INT32 GFMGetVersion(void);
    #ifdef __cplusplus
    }
    #endif
    

    verpackt.



  • Vielen Dank schonmal für eure Hilfe!!

    Laut API-Beschreibung sollte man für die Programmierung C++ nehmen. Hier die einzige Hinweise für die Installation der Dokumentation. Ansonsten sind nur noch die Funktionen beschrieben.

    http://www.abload.de/img/install6nf6.png

    Kann man also davon ausgehen, dass es sich um eine C++ lib handelt?



  • Hier mal der Inhalt der Header-Datei. Eventuell hilft das ja auch noch weiter:
    #ifndef AlligatorAPI_h__
    #define AlligatorAPI_h__

    #ifdef _WIN32
    #include <Windows.h>
    #endif

    typedef INT32 ALI_ID;
    typedef INT32 * ALI_ID_PTR;

    // Error Indicators
    #define ALL_OKAY 1L
    #define MEMORY_EXHAUSTED -1L
    #define UNKNOWN_DEVICE_ID -2L
    #define BAD_PARAMETER -3L
    #define USB_SEND_ERROR -4L
    #define USB_RECEIVE_ERROR -5L
    #define DRIVER_NOT_INITIALIZED -6L
    #define USB_DEVICE_NOT_PROGRAMMED -7L
    #define UNKNOWN_SEQUENCE_ID -8L
    #define UNKNOWN_SEQ_INQUIRE_TYPE -9L
    #define NOT_IMPLEMENTED -10L

    // Trigger modes
    // Master/slave
    #define TRIGGER_MODE_PROJECTOR_MASTER 0L
    #define TRIGGER_MODE_PROJECTOR_SLAVE 1L

    // Polarity
    #define TRIGGER_POLARITY_ACTIVE_LOW 0L
    #define TRIGGER_POLARITY_ACTIVE_HIGH 1L

    // Edge
    #define TRIGGER_EDGE_HIGH_TO_LOW 0L
    #define TRIGGER_EDGE_LOW_TO_HIGH 1L

    // Sequence inquire types
    #define SEQ_INQUIRE_TYPE_PicNum -2L
    #define SEQ_INQUIRE_TYPE_StartAddress -1L
    #define SEQ_INQUIRE_TYPE_BitPlanes 0L
    #define SEQ_INQUIRE_TYPE_IlluminateTime 1L
    #define SEQ_INQUIRE_TYPE_PictureTime 2L
    #define SEQ_INQUIRE_TYPE_TriggerDelay 3L
    #define SEQ_INQUIRE_TYPE_TriggerPulseWidth 4L
    #define SEQ_INQUIRE_TYPE_VDDelay 5L
    #define SEQ_INQUIRE_TYPE_ImageRepeat 6L

    #define ALI_ASYNCHRONOUS 0
    #define ALI_SYNCHRONOUS 1

    // Max number of images vs. bit depth
    // Limited by about of DRAM (2 Gbit)
    #define MAX_IMAGES_1_BITS 2730
    #define MAX_IMAGES_2_BITS 1365
    #define MAX_IMAGES_3_BITS 910
    #define MAX_IMAGES_4_BITS 682
    #define MAX_IMAGES_5_BITS 546
    #define MAX_IMAGES_6_BITS 455
    #define MAX_IMAGES_7_BITS 390
    #define MAX_IMAGES_8_BITS 341

    // Max frequence vs. bit depth
    #define MAX_FPS_1_BITS 8000
    #define MAX_FPS_2_BITS 3855
    #define MAX_FPS_3_BITS 2345
    #define MAX_FPS_4_BITS 1540
    #define MAX_FPS_5_BITS 980
    #define MAX_FPS_6_BITS 605
    #define MAX_FPS_7_BITS 355
    #define MAX_FPS_8_BITS 200

    // do not define A3D_API, for internal use only
    #ifndef ALLIGATORDLL_API
    #ifdef __cplusplus
    #define ALLIGATORDLL_API extern "C"
    #else
    #define ALLIGATORDLL_API extern
    #endif
    #endif

    /// version of this API header. You can compare it with the value returned from GFMGetVersion()
    #define GFM_VERSION 2002

    /// get the version of the API.
    /// The version number is represented as decimal integer with 4 digits,
    /// ie. API version v2.3.0.0 is represented as decimal 2300.
    ALLIGATORDLL_API INT32 GFMGetVersion(void);

    ALLIGATORDLL_API char *GFMErrorcodeToChar(INT32 code);

    ALLIGATORDLL_API INT32 GFMNumberOfDevices(void);

    ALLIGATORDLL_API INT32 GFMDevAlloc(INT32 DeviceNumber, ALI_ID_PTR devicePointer);
    ALLIGATORDLL_API INT32 GFMDevID(ALI_ID DeviceID, INT32 *idLow, INT32 *idHigh);
    ALLIGATORDLL_API INT32 GFMDevTriggerControl(ALI_ID Device, INT32 Mode, INT32 Polarity, INT32 Edge);
    ALLIGATORDLL_API INT32 GFMDevHalt(ALI_ID DeviceID);
    ALLIGATORDLL_API INT32 GFMDevFree(ALI_ID DeviceID);

    ALLIGATORDLL_API INT32 GFMSeqAlloc(ALI_ID DeviceId, INT32 BitPlanes, INT32 PicNum, ALI_ID_PTR SequenceIdPtr );
    ALLIGATORDLL_API INT32 GFMSeqPut (ALI_ID DeviceId, ALI_ID SequenceId, INT32 Offset, INT32 Number, void *UserArrayPtr );
    ALLIGATORDLL_API INT32 GFMSeqGet (ALI_ID DeviceId, ALI_ID SequenceId, INT32 Offset, INT32 Number, void *UserArrayPtr );
    ALLIGATORDLL_API INT32 GFMSeqTiming(ALI_ID DeviceId, ALI_ID SequenceId, INT32 IlluminateTime, INT32 PictureTime, INT32 TriggerDelay, INT32 TriggerPulseWidth, INT32 VdDelay, INT32 imageRepeat = 1 );
    ALLIGATORDLL_API INT32 GFMSeqTimingInquire(ALI_ID DeviceId, ALI_ID SequenceId, INT32 InquireType, INT32 *UserVarPtr );
    ALLIGATORDLL_API INT32 GFMSeqFree(ALI_ID DeviceId, ALI_ID SequenceId);

    ALLIGATORDLL_API INT32 GFMProjSyncMode(ALI_ID DeviceID, INT32 SyncMode);
    ALLIGATORDLL_API INT32 GFMProjSyncInquire(ALI_ID DeviceId, INT32 *SyncMode);
    ALLIGATORDLL_API INT32 GFMProjStart (ALI_ID DeviceId, ALI_ID SequenceId, INT32 Repeat);
    ALLIGATORDLL_API INT32 GFMProjStartCont (ALI_ID DeviceId, ALI_ID SequenceId);
    ALLIGATORDLL_API INT32 GFMProjWait (ALI_ID DeviceId);
    ALLIGATORDLL_API INT32 GFMProjHalt (ALI_ID DeviceId);

    ALLIGATORDLL_API INT32 GFMSetGPIOMode(ALI_ID DeviceID, INT32 Direction, INT32 Periph, INT32 Mask);
    ALLIGATORDLL_API INT32 GFMGetGPIOMode(ALI_ID DeviceID, INT32 *Direction, INT32 *Periph);
    ALLIGATORDLL_API INT32 GFMSetGPIO(ALI_ID DeviceID, INT32 Value, INT32 Mask);
    ALLIGATORDLL_API INT32 GFMGetGPIO(ALI_ID DeviceID, INT32 *Value);

    #endif // AlligatorAPI_h__



  • - zu schnell gelesen



  • kanns es sein, dass ich die DLL-Daten initialisieren muss? Es scheint mir, dass aie beim kompilieren schlicht nicht "eingelesen" wird und der linker dann nichts finden kann.

    hier wäre ein artikel aus dem microsoft msdn:
    http://msdn.microsoft.com/de-de/library/66f127e5(v=vs.80).aspx



  • Neuigkeiten:

    Ich habe die Dateien jetzt mal an unseren Fachbereich Informatik weitergereicht. Laut deren Aussage funktioniert die Linker lib nicht korrekt, also ist schlicht die Datei defekt. Ich habe jetzt nochmal den Hersteller angeschrieben und warte nun auf Antwort.

    Gruß Jörg


Anmelden zum Antworten