WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Spezifisches Mex-Problem

 

slisystem
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 05.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2014, 19:53     Titel: Spezifisches Mex-Problem
  Antworten mit Zitat      
Hi liebes Forum,

ich habe ein ziemlich spezifisches Problem mit der mex-Funktion und hoffe, ihr könnt mir helfen.

Ich muss einen "Thorlabs WFS 150C" (http://www.thorlabs.de/newgrouppage9.cfm?objectgroup_id=2946)
über Matlab ansteuern.

Es gab einen voll funktionstüchtigen C-Beispielcode, den ich auch problemlos und funktionstüchtig kompilieren kann.

Mein Ziel war also, diesen Beispiel-Code über mex in Matlab einzubinden. Das hat so weit auch funktioniert, hier der Code:

Code:
#include "wfs_drv.h"    // Wavefront Sensor driver's header file
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "mex.h"

/*===============================================================================================================================
  Defines
===============================================================================================================================*/

//Notwendig für MEX
#define WFS_close
#define WFS_ErrorMessage
#define WFS_RevisionQuery

/*===============================================================================================================================
  Data type definitions
===============================================================================================================================*/
typedef struct
{
   char              version_wfs_driver[WFS_BUFFER_SIZE];
   char              version_cam_driver[WFS_BUFFER_SIZE];

   int               handle;

}  instr_t;

/*===============================================================================================================================
  Function Prototypes + Global Variables
===============================================================================================================================*/

void handle_errors (int);
instr_t     instr = { 0 };    // all instrument related data are stored in this structure

/*===============================================================================================================================
  Code
===============================================================================================================================*/
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
   int               err;

    // Get the driver revision
   if(err = WFS_RevisionQuery (NULL, instr.version_wfs_driver, instr.version_cam_driver)) // pass NULL because handle is not yet initialized
      handle_errors(err);

   printf("Camera USB driver version     : %s\n", instr.version_cam_driver);
   printf("WFS instrument driver version : %s\n\n", instr.version_wfs_driver);
}

/*===============================================================================================================================
  Handle Errors
  This function retrieves the appropriate text to the given error number and closes the connection in case of an error
===============================================================================================================================*/
void handle_errors (int err)
{
   char buf[WFS_ERR_DESCR_BUFFER_SIZE];

   if(!err) return;

   // Get error string
   WFS_ErrorMessage (instr.handle, err, buf);

   if(err < 0) // errors
   {
      printf("\nWavefront Sensor Error: %s\n", buf);

      // close instrument after an error has occured
      printf("Sample program will be closed because of the occured error, press <ENTER>.");
      WFS_close(instr.handle); // required to release allocated driver data
      fflush(stdin);
      getchar();
      exit(1);
   }
}
 


Ich habe jetzt einiges, was irrelevant ist, rausgenommen.

Wenn ich jetzt den Mex-Befehl
Code:
mex minimal_mex.c -v -largeArrayDims -IC:\Users\[...] -lWFS_Drv -LC:\Users\[...]

benutze, erscheint eine einzige Warnung, aber er kompiliert:

Zitat:
minimal_mex_forum.c(43) : warning C4047: '=' : 'int' differs in levels of indirection from 'char *'


Diese Warnung, welche ich leider nicht komplett verstehe, kam auch bei allen anderen Funktionen (habe ich jetzt alle rausgenommen, um ein exemplarisches Beispiel zu haben), die über die "err = ..." Abfrage verfügten. . Wenn ich die gemexte Funktion jetzt starte, stürzt Matlab augenblicklich ab. Ändere ich die Zeile

Code:
  if(err = WFS_RevisionQuery (NULL, instr.version_wfs_driver, instr.version_cam_driver)) // pass NULL because handle is not yet initialized
      handle_errors(err);


wie folgt:

Code:
WFS_RevisionQuery (NULL, instr.version_wfs_driver, instr.version_cam_driver);


läuft das Programm, nur die Funktion wird leider nicht sinngemäß benutzt, denn die Ausgabe spuckt keine Werte aus. Hier mal die Beschreibung von WFS_RevisionQuery:

Zitat:
WFS_RevisionQuery
int WFS_RevisionQuery (WFS_hdl, char instrumentDriverRevision[], char camDriverRevision[]);
Purpose
This function returns the revisions of the WFS instrument driver and camera driver.

Parameters
Input
Name Type Description
instrumentHandle WFS_hdl
This parameter accepts the instrument handle returned by function init to select the desired instrument driver session. You may also pass NULL. In this case only a valid instrument driver revision is returned.

Output
Name Type Description
instrumentDriverRevision char []
This parameter returns the WFS Instrument Driver software revision.
Note: The string must contain at least WFS_BUFFER_SIZE (256) elements (char[WFS_BUFFER_SIZE]).
Revision is coded for example: "3.0"

camDriverRevision char []
This parameter returns the Camera Driver Revision the WFS instrument driver is calling. A valid instrument handle is required for this.
Format:
major.minor.built_no for WFS150/WFS300 series instruments
major.minor for WFS10 series instruments
Note: The string must contain at least WFS_BUFFER_SIZE (256) elements (char[WFS_BUFFER_SIZE]).

Return Value
Name Type Description
status int
This value shows the status code returned by the function call.
For Status Codes see function ErrorMessage.


Der selbe Code, ohne die Mex-spezifischen Änderungen, kompiliert und funktioniert unter C tadellos.

Meine Befürchtung ist also, dass Mex irgendwie mit der Library nicht klar kommt - kann mir da jemand helfen?
Was ich als potentiellen Fehler sehe: Die
Code:
#define WFS_close
#define WFS_ErrorMessage
#define WFS_RevisionQuery

habe ich eingefügt, da das Kompilieren sonst immer mit dem Fehler
Zitat:
minimal_mex.obj : error LNK2019: unresolved external symbol WFS_ErrorMessage referenced in function handle_errors
(pro nicht definierter Fkt. halt einer) abgebrochen hat. Kann es sein, dass er so zwar kompiliert, die Funktionen aber gar keine Funktion haben? Auf der anderen Seite verstehe ich den Fehler nicht, denn die Library liegt genau in dem Pfad, den ich angegeben habe. Mex findet sie auch, was man durch das "-v" ja einsehen kann.


Alle relevanten Dateien habe ich angehängt.

Meine Spezifikation:
Windows 7 Enterprise (64 bit)
Matlab: R2013b
Compiler: Microsoft Software Development Kit (SDK) 7.1

Mex_Forum.zip
 Beschreibung:

Download
 Dateiname:  Mex_Forum.zip
 Dateigröße:  11.93 KB
 Heruntergeladen:  479 mal
Private Nachricht senden Benutzer-Profile anzeigen


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.