IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

LabVIEW Discussion :

[LabVIEW 8.2] Trouver les bons types d'argument d'une dll


Sujet :

LabVIEW

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut [LabVIEW 8.2] Trouver les bons types d'argument d'une dll
    Bonjour,
    Je me pose bcp de questions sur les correspondances entre les types des paramètres de ma dll et ceux proposés par Labview.

    Voici les fonctions de ma dll (Rq : ces fonctions permettent de communiquer avec un port série) :

    BOOL OpenCOM(HANDLE *g_hCOM, int nId);
    BOOL CloseCOM(HANDLE *g_hCOM);
    BOOL ReadCOM(HANDLE *g_hCOM, void* buffer, int nBytesToRead, int* pBytesRead);
    BOOL WriteCOM(HANDLE *g_hCOM, void* buffer, int nBytesToWrite, int* pBytesWritten);

    Mais je n'arrive pas à trouver les bon types pour mes différents arguments..

    Si quelqu'un à une idée à mon problème.
    Merci d'avance!

  2. #2
    Membre chevronné

    Inscrit en
    Avril 2005
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 144
    Points : 1 973
    Points
    1 973
    Par défaut
    Salut,

    Concernant le void, je te conceille de prendre un tableau de U8 par deduction

    Concernant le Handle, c'est un peu plus compliqué: tu dois regarder dans la doc de la dll pour etre plus precis. A defaut, j'essaierais un U16, U32, ou un tableau de U8 ( sic).

    a+
    L'urgent est fait, l'impossible est en cours, pour les miracles, prévoir un délai et un bon thermos.
    Quant aux MP techniques, autant les poster sur le forum approprié car, là, ils auront des réponses.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci Scyrius de ton aide,

    En fait, dès la première fonction qui est l'ouverture du port série, labview plante et je reçois une erreur windows :
    LabVIEW 8.2.1 Development System a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru

    voila comment j'ai parametré ma fonction :
    long OpenCOM(unsigned short int *g_hCOM, long nId);
    donc BOOL --> I32
    *HANDLE --> U16
    int --> I32
    Je me suis référé à l'aide LABVIEW ainsi qu'à tes conseils mais il semble que je me trompe qqpart...

    Concernant le HANDLE, il s'agit de l'identifiant que va attribuer le prog au port série, je ne sais pas de quel type il s'agit en Labview..

    Je peux te joindre le code de la dll que j'ai testé avec un programme en C est qui fonctionne parfaitement :

    Header : dllFAB_pointeur.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #ifndef __dllFAB_pointeur_H__
    #define __dllFAB_pointeur_H__
    
    #ifdef __cplusplus
    #define DllImport  extern "C" __declspec(dllimport)
    #else
    #define DllImport  __declspec(dllimport)
    #endif
    
    #include <windows.h>
    
    DllImport BOOL __stdcall OpenCOM(HANDLE *g_hCOM, int nId);
    DllImport BOOL __stdcall CloseCOM(HANDLE *g_hCOM);
    DllImport BOOL __stdcall ReadCOM(HANDLE *g_hCOM, void* buffer, int nBytesToRead, int* pBytesRead);
    DllImport BOOL __stdcall WriteCOM(HANDLE *g_hCOM, void* buffer, int nBytesToWrite, int* pBytesWritten);
    
    
    #endif
    source : dllFAB_pointeur.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include "dllFAB_pointeur.h"
    
    /*=============================================================================
      Définition de constantes
    =============================================================================*/
    #define RX_SIZE         4096    /* taille tampon d'entrée  */
    #define TX_SIZE         4096    /* taille tampon de sortie */
    #define MAX_WAIT_READ   5000    /* temps max d'attente pour lecture (en ms) */
    #ifdef __cplusplus
    #define DllExport  extern "C" __declspec(dllexport)
    #else
    #define DllExport  __declspec(dllexport)
    #endif
    
    
    
    /******************************************************************************
      OpenCOM : ouverture et configuration du port COM.
      entrée : nId : Id du port COM à ouvrir.
      retour : vrai si l'opération a réussi, faux sinon.
    ******************************************************************************/
    DllExport BOOL __stdcall OpenCOM(HANDLE *g_hCOM, int nId)
    {
        /* variables locales */
        char szCOM[16];
        /* Délais d'attente sur le port COM */
        COMMTIMEOUTS g_cto =
        {
            MAX_WAIT_READ,  /* ReadIntervalTimeOut          */
            0,              /* ReadTotalTimeOutMultiplier   */
            MAX_WAIT_READ,  /* ReadTotalTimeOutConstant     */
            0,              /* WriteTotalTimeOutMultiplier  */
            0               /* WriteTotalTimeOutConstant    */
        };
    
        /* Configuration du port COM */
        DCB g_dcb =
        {
            sizeof(DCB),        /* DCBlength            */
            9600,               /* BaudRate             */
            TRUE,               /* fBinary              */
            FALSE,              /* fParity              */
            FALSE,              /* fOutxCtsFlow         */
            FALSE,              /* fOutxDsrFlow         */
            DTR_CONTROL_ENABLE, /* fDtrControl          */
            FALSE,              /* fDsrSensitivity      */
            FALSE,              /* fTXContinueOnXoff    */
            FALSE,              /* fOutX                */
            FALSE,              /* fInX                 */
            FALSE,              /* fErrorChar           */
            FALSE,              /* fNull                */
            RTS_CONTROL_ENABLE, /* fRtsControl          */
            FALSE,              /* fAbortOnError        */
            0,                  /* fDummy2              */
            0,                  /* wReserved            */
            0x100,              /* XonLim               */
            0x100,              /* XoffLim              */
            8,                  /* ByteSize             */
            NOPARITY,           /* Parity               */
            ONESTOPBIT,         /* StopBits             */
            0x11,               /* XonChar              */
            0x13,               /* XoffChar             */
            '?',                /* ErrorChar            */
            0x1A,               /* EofChar              */
            0x10                /* EvtChar              */
        };
    
    
        /* construction du nom du port, tentative d'ouverture */
        sprintf(szCOM, "COM%d", nId);
        *g_hCOM = (HANDLE)CreateFile(szCOM, GENERIC_READ|GENERIC_WRITE, 0, NULL,
                            OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
        if(*g_hCOM == INVALID_HANDLE_VALUE)
        {
            printf("Erreur lors de l'ouverture du port COM%d", nId);
            return FALSE;
        }
    
        /* affectation taille des tampons d'émission et de réception */
        SetupComm(*g_hCOM, RX_SIZE, TX_SIZE);
        /* configuration du port COM */
        if(!SetCommTimeouts(*g_hCOM, &g_cto) || !SetCommState(*g_hCOM, &g_dcb))
        {
            printf("Erreur lors de la configuration du port COM%d", nId);
            CloseHandle(*g_hCOM);
            return FALSE;
        }
    
        /* on vide les tampons d'émission et de réception, mise à 1 DTR */
        PurgeComm(*g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
        EscapeCommFunction(*g_hCOM, SETDTR);
        return TRUE;
    }
    
    /******************************************************************************
      CloseCOM : fermeture du port COM.
      retour : vrai si l'opération a réussi, faux sinon.
    ******************************************************************************/
    DllExport BOOL __stdcall CloseCOM(HANDLE *g_hCOM)
    {
        /* fermeture du port COM */
        CloseHandle(*g_hCOM);
        return TRUE;
    }
    
    /******************************************************************************
      ReadCOM : lecture de données sur le port COM.
      entrée : buffer       : buffer où mettre les données lues.
               nBytesToRead : nombre max d'octets à lire.
               pBytesRead   : variable qui va recevoir le nombre d'octets lus.
      retour : vrai si l'opération a réussi, faux sinon.
    -------------------------------------------------------------------------------
      Remarques : - la constante MAX_WAIT_READ utilisée dans la structure
                    COMMTIMEOUTS permet de limiter le temps d'attente si aucun
                    caractères n'est présent dans le tampon d'entrée.
                  - la fonction peut donc retourner vrai sans avoir lu de données.
    ******************************************************************************/
    DllExport BOOL __stdcall ReadCOM(HANDLE *g_hCOM, void* buffer, int nBytesToRead, int* pBytesRead)
    {
        return ReadFile(*g_hCOM, buffer, nBytesToRead, (DWORD*)pBytesRead, NULL);/*ajout d'un cast*/
    }
    
    /******************************************************************************
      WriteCOM : envoi de données sur le port COM.
      entrée : buffer        : buffer avec les données à envoyer.
               nBytesToWrite : nombre d'octets à envoyer.
               pBytesWritten : variable qui va recevoir le nombre d'octets
                               envoyés.
      retour : vrai si l'opération a réussi, faux sinon.
    ******************************************************************************/
    DllExport BOOL __stdcall WriteCOM(HANDLE *g_hCOM, void* buffer, int nBytesToWrite, int* pBytesWritten)
    {
        /* écriture sur le port */
        return WriteFile(*g_hCOM, buffer, nBytesToWrite, (DWORD*)pBytesWritten, NULL);
    
    }
    
    
    BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
    DWORD reason /* Reason this function is being called. */ ,
    LPVOID reserved /* Not used. */ )
    {
    switch (reason)
    {
    case DLL_PROCESS_ATTACH:
    break;
    
    case DLL_PROCESS_DETACH:
    break;
    
    case DLL_THREAD_ATTACH:
    break;
    
    case DLL_THREAD_DETACH:
    break;
    }
    
    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
    }

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Si tu le souhaites je peux t'envoyer ma dll si tu souhaites faire un test dessus, cela ne me pose aucun problème, tiens moi au courant.
    Et encore merci de ton aide.

    PS : Dsl pour la faute d'orthographe sur le mess précédent "et" au lieu de "est"...

  5. #5
    Membre chevronné

    Inscrit en
    Avril 2005
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 144
    Points : 1 973
    Points
    1 973
    Par défaut
    Salut,

    Je viens de jeter un petit coup d'oeil: tu utilise des fonctions "standards" Windows, ca devrait etre transposable en LV.

    Peux-tu poster ta dll que je fasse un essai de mon coté?
    Quel compilateur utilises-tu? ( au cas oû)

    Une remarque pour finir: y-a-til une raison pour laquelle tu n'utilise pas les fonctions "standards" LV pour utiliser le port serie?

    a+
    L'urgent est fait, l'impossible est en cours, pour les miracles, prévoir un délai et un bon thermos.
    Quant aux MP techniques, autant les poster sur le forum approprié car, là, ils auront des réponses.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Voila la dll, je l'ai compilé avec GCC.

    C'est vrai qu'il existe deja des fonctions d'ouverture, d'écriture... avec un port série sur Labview (qui fonctionnent très bien puisque je les utilise en ce moment même ) , mais je souhaite bien comprendre le fonctionnement des dll sous Labview donc en utiliser et par la suite en réaliser avec Labview et les utiliser dans d'autre prog (en Labview dans un premier temps puis en C...) (peut être me reverras tu dans un prochain poste à ce sujet...).
    Fichiers attachés Fichiers attachés

  7. #7
    Membre chevronné

    Inscrit en
    Avril 2005
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 144
    Points : 1 973
    Points
    1 973
    Par défaut
    no problemo, je regarde cela ce soir ( si j'ai 5 minutes)

    a+
    L'urgent est fait, l'impossible est en cours, pour les miracles, prévoir un délai et un bon thermos.
    Quant aux MP techniques, autant les poster sur le forum approprié car, là, ils auront des réponses.

  8. #8
    Membre chevronné

    Inscrit en
    Avril 2005
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 144
    Points : 1 973
    Points
    1 973
    Par défaut
    Salut,

    J'ai essayé et je ne plante pas.
    Par contre, je n'ai pas de port série sur mon portable, donc, le handle est à -1.

    Concernant la marche à suivre, j'ai commencé par la fonction OPEN (cf PJ).
    J'ai pris des types simples. Attention au passage par valeur ou par pointeur.

    Sinon, rien de mieux: il faut essayer progressivement.

    A+
    Images attachées Images attachées  
    L'urgent est fait, l'impossible est en cours, pour les miracles, prévoir un délai et un bon thermos.
    Quant aux MP techniques, autant les poster sur le forum approprié car, là, ils auront des réponses.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Salut,

    J'ai essayé également et je ne plante pas non plus, la fonction OpenCOM me renvoie bien une valeur pour le handle du port COM, cependant normalement la fonction doit retourner un booléen si tout s'est bien passé. J'ai mis en argument de sortie un uint8 mais j'ai toujours la valeur 0... Je pense que si cela se passait bien, je devrait avoir un 1. Que te revoie la fonction dans ton VI?

    Ensuite lorsque j'envoie des données, dans ma dll il s'agit d'un pointeur (void* buffer), j'ai essayé de mettre un pointeur de chaine de caractère, puisque c'est ce que l'appareil est sensé lire, mais pas de réaction... As tu une idée de ce que je pourrais mettre?

    Je te joins mon VI, cela sera peut etre plus clair pour toi.
    Fichiers attachés Fichiers attachés

  10. #10
    Membre chevronné

    Inscrit en
    Avril 2005
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 144
    Points : 1 973
    Points
    1 973
    Par défaut
    Salut,

    Je n'ai pas de port COM ce qui me génère obligatoirement une erreur. Donc difficile de tester correctement...

    Par contre, sur chaque fonction de la dll, essaie de mettre une entrée ( même si la valeur est 0). Cela permet d'initialiser les variables.

    Pour les types, attention aussi à ce que tu passes: en creusant un peu plus dans les définitions, j'ai vu que le handle devrait être un I32 (au lieu de U32).

    Dernier point concernant les STRING, tu lis un caractère et tu en écrit 16 ( sur une chaine de 64): attention à tes valeurs ( je dirai que tu mélanges les valeurs hexa et ascii d'un caractère).

    A part ces petits points, ton code semble bon.
    L'urgent est fait, l'impossible est en cours, pour les miracles, prévoir un délai et un bon thermos.
    Quant aux MP techniques, autant les poster sur le forum approprié car, là, ils auront des réponses.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Salut,

    Effectivement la chaine que je souhaitais envoyer était en hexa (issue de mon code en C), alors que je dois écrire sur le port une chaine de 16 octets. Ensuite, pour la lecture, c'est normal que je doivent lire qu'un seul octet provenant de l'appareil.

    Concernant le Handle, j'ai essayé avec un I32 mais il me revoie la valeur -1. Avec un U32 j'ai une valeur différente (genre 4324324) Ensuite dans l'aide Labview, j'ai pu voir qu'ils conseillaient de mettre un U32 dans un cas similaire au mien. Mais le problème c'est que je n'arrive pas à écrire correctement sur le port donc je ne peux pas dire lequel des 2 types est le bon pour le handle...

    Et malheureusement, il n'y a aucune erreur qui pourrait me guider... Je continue les essais...

  12. #12
    Membre chevronné

    Inscrit en
    Avril 2005
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 144
    Points : 1 973
    Points
    1 973
    Par défaut
    Salut,

    Comme tu l'as ecrit dans ton code, le handle à -1 signifierait INVALIDE_HANDLE_VALUE. Je t'ai parlé de I32 (32bit signé) à cause de cela.
    La valeur en U32 est-elle 4294967295? ( 16*1 en binaire). Si oui, cela confirme ce que je dis.

    Autre piste: le nId est un int. que lui as-tu passé? 1 en I32?

    Ps: la, je n'ai pas LV, donc, je ne peut plus lire tes PJ. je travaille de memoire.
    L'urgent est fait, l'impossible est en cours, pour les miracles, prévoir un délai et un bon thermos.
    Quant aux MP techniques, autant les poster sur le forum approprié car, là, ils auront des réponses.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Tu as raison la valeur que j'obtiens est bien 4294967295... J'ai donc bien INVALIDE_HANDLE_VALUE. J'ai repassé le handle en I32
    Ensuite la valeur que je passe pour nId est bien 1 en I32. J'ai essayé d'autres types, sans trop de succès.

  14. #14
    Membre chevronné

    Inscrit en
    Avril 2005
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 144
    Points : 1 973
    Points
    1 973
    Par défaut
    essaie de mettre le nId à 0.
    L'urgent est fait, l'impossible est en cours, pour les miracles, prévoir un délai et un bon thermos.
    Quant aux MP techniques, autant les poster sur le forum approprié car, là, ils auront des réponses.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Cela n'a pas changé

  16. #16
    Membre chevronné

    Inscrit en
    Avril 2005
    Messages
    1 144
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 144
    Points : 1 973
    Points
    1 973
    Par défaut
    Je n'ai plus d'autre idée...
    Et comme je ne peux pas tester de mon coté, ca va etre dur.

    Derniere piste: essaie d'ajouter dans ta dll des mouchards ( enregistrement dans un fichier log par ex) afin de voir les valeurs passées. Ca te permettra d'avancer et de voir où ca coince.
    L'urgent est fait, l'impossible est en cours, pour les miracles, prévoir un délai et un bon thermos.
    Quant aux MP techniques, autant les poster sur le forum approprié car, là, ils auront des réponses.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Salut Scyrius,

    Merci de ton dernier conseil, en fait mes (tes) arguments étaient bons, je m'en suis rendu compte en écrivant dans un fichier log. En fait le prob semblait venir d'un conflit entre le prog que j'essayais de lancer et un autre vi labVIEW qui tournait en parallèle. Donc qd j'ai vu que les paramètres étaient les bons j'ai regardé ailleurs que dans le prog.
    Bref, ca marche, alors un grand grand merci à toi.

    Bon continuation et peut etre à un de ces 4.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Watershed: trouver les bons marqueurs
    Par Gakusei dans le forum Images
    Réponses: 4
    Dernier message: 27/04/2012, 10h06
  2. Les bons types de jeu sur smartphone.
    Par elmcherqui dans le forum Développement 2D, 3D et Jeux
    Réponses: 15
    Dernier message: 19/04/2011, 09h36
  3. Réponses: 7
    Dernier message: 09/05/2007, 15h58
  4. Réponses: 5
    Dernier message: 11/09/2006, 17h29
  5. [RegEx] Trouver les appels statique et dynamique d'une class
    Par jeff_! dans le forum Langage
    Réponses: 8
    Dernier message: 07/04/2006, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo