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

Lazarus Pascal Discussion :

Échange via une liaison USB


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut Échange via une liaison USB
    Bonjour à toutes et à tous,

    J'ai acheté une station météo qui envoie ses données à un PC via une liaison USB.

    Mais il semble que le protocole utilisé ne soit pas basé sur le modèle UART (liaison série COM X que l'on peut gérer avec une bibliothèque type "Synaser").

    Existe-t-il des bibliothèques pour Lazarus gérant ces liaisons USB ?

    Cordialement.

    Pierre.

  2. #2
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 179
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    Allez voir libusb.

    bb

    Lien corrigé (23/09/2023).

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Merci, je vais aller voir ça ce W.E.

    Cordialement.

    Pierre.

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 359
    Points : 565
    Points
    565
    Billets dans le blog
    2
    Par défaut https://github.com/libusb: Lien mort
    Citation Envoyé par bb84000 Voir le message
    Bonjour,

    Allez voir libusb.

    bb
    Lien mort - Utiliser https://github.com/libusb/libusb

  5. #5
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 179
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    J'ai corrigé le lien dans mon message. Il manquait un "i" à la fin. Le revoici en clair :

    https://github.com/libusb/hidapi

    API des fonctions de communications les plus courantes avec un périphérique USB (utilise libusb)

    bb

    Note: Je ne peux corriger le lien dans les réponses. Si un modérateur s'en sent le courage, merci d'avance...

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Merci pour ce lien.

    Pour autant, si cette libraire est multiplateforme, elle n'est pas multilangage et donc je ne sais/peux pas l'utiliser avec Lazarus.

    Cordialement.

    Pierre.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 930
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 930
    Points : 15 375
    Points
    15 375
    Par défaut
    Salut,

    Citation Envoyé par ChPr Voir le message
    Pour autant, si cette libraire est multiplateforme, elle n'est pas multilangage et donc je ne sais/peux pas l'utiliser avec Lazarus.
    Je ne comprends pas cette remarque : si je fais une recherche dans Synaptic (gestionnaire de librairies, programmes, etc.) sur libhidapi-dev tel qu'indiqué dans le readme.md (tout en bas, avant-dernière entrée), j'y trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    This package contains the files needed to compile and link programs which use HIDAPI.
    Et tu vois bien qu'il n'y a pas de restrictions.

    Ensuite, une petite recherche sur le web ("libhidapi pascal") te donnera la suite :
    https://github.com/prof7bit/HIDAPI.pas
    https://forum.lazarus.freepascal.org...?topic=44283.0
    etc.

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Merci Jipété pour ces infos et ces liens.

    Pour HIDAPI.pas, j'ai réussi à compiler la démo sous Windows et Ubuntu, mais sous Windows, je n'ai pas été fichu de trouver la librarie "hidapi-libusb.dll".

    Par ailleurs, j'avais trouvé de mon côté le lien vers " LongDirtyAnimAlf / FPC-USB-HID ". Là encore, sous Ubuntu, la démo se compile et s'exécute, mais sous Windows, je n'y suis pas arrivé.

    Tout d’abord, quand je charge le projet "FpcUsbHidConsole.lpi" Lazarus me répond qu'il n'y a pas de fichier source !
    J'ai recréé de toute pièce une application console "USB_Windows" en reprenant le code de "FpcUsbHidConsole.lpi" et en mettant tous les liens nécessaires pour avoir accès aux différents fichiers *.pas et *.inc nécessaires.
    Là, tout compile sauf la première ligne du programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ServiceWndClass.lpfnWndProc     := @ServiceWndProc;
    avec le code d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    USB_Windows.pas(78,38) Error: Incompatible types: got "<address of function(QWord;LongWord;Int64;Int64):LongInt;StdCall>" expected "<procedure variable type of function(QWord;LongWord;Int64;Int64):Int64;StdCall>"
    J'imagine qu'au moment où cela a été écrit, ça devait compiler. Je n'arrive pas à voir ce qu'il faut faire (quel drapeau utiliser, quelle modif faire, ...).

    Si je commente cette ligne, le programme se compile et s'exécute, mais bien sûr, il plante avec une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le projet USB_Windows a levé une classe d'exception "External : SIGSEGV".
    Toute proposition est la bienvenue.

    Cordialement.

    Pierre.

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 443
    Points : 5 863
    Points
    5 863
    Par défaut
    Salut

    a priori c'est le retour de fonction qui pose probleme entre longint et un int64

    PS : Tu compile sur quel materiel et pour quel systeme (32 ou 64 ) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function ServiceWndProc(HWindow: HWnd; Message: UINT; WParam: WPARAM; LParam: LPARAM): Longint  integer;stdcall;

  10. #10
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par anapurna Voir le message
    ... a priori c'est le retour de fonction qui pose probleme entre longint et un int64 ...
    Au vu de l'erreur, le problème semble plutôt être dû à une confusion entre une adresse et une procédure ?

    Citation Envoyé par anapurna Voir le message
    ...PS : Tu compile sur quel materiel et pour quel systeme (32 ou 64 ) ? ...
    Je travaille avec un PC équipé d'un AMD Ryzen 3 3200G with Radeon et sous Windows 10 64 bit.

    Cordialement.

    Pierre.

  11. #11
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par ChPr Voir le message
    ... J'ai recréé de toute pièce une application console "USB_Windows" en reprenant le code de "FpcUsbHidConsole.lpi" et en mettant tous les liens nécessaires pour avoir accès aux différents fichiers *.pas et *.inc nécessaires.
    Là, tout compile sauf la première ligne du programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ServiceWndClass.lpfnWndProc     := @ServiceWndProc;
    ...
    Bon, j'ai trouvé la cause de ce problème. En recréant une application, elle a pris par défaut le mode "Pascal Objet" qui s'est traduit par ligne : {$mode objfpc}{$H+} en début du fichier "USB_Windows.pas".

    Mais pour les autres fichiers, il faut le mode "DELPHI", ce que j'ai spécifié dans le menu "Projet/Option de Projet/Option du compilateur/Analyse". Pour autant, cette action n'a pas supprimé le mode "Pascal Objet " mentionné en haut du fichier "USB_Windows.pas". Donc tous les fichiers étaient en mode DELPHI, sauf "USB_Windows.pas".

    J'ai supprimé {$mode objfpc}{$H+} au début de mon fichier et tout est rentré dans l'ordre : ça compile et ça s'exécute.

    Ce problème est résolu, mais pas celui du fichier "hidapi-libusb.dll" que je ne trouve pas.

    Cordialement.

    Pierre.

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 930
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 930
    Points : 15 375
    Points
    15 375
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Ce problème est résolu, mais pas celui du fichier "hidapi-libusb.dll" que je ne trouve pas.
    Peut-être parce que ce fichier n'existe pas ? D'où sors-tu ce nom ?
    Quand je fais une recherche ggl avec ce nom, ça me remonte un tas d'articles où ce nom très précisément n'est pas présent !

    Tiens, jette un coup d'œil là, c'est ultra-court : https://python-elgato-streamdeck.rea...sb_hidapi.html

  13. #13
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 179
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    Citation Envoyé par ChPr Voir le message
    Ce problème est résolu, mais pas celui du fichier "hidapi-libusb.dll" que je ne trouve pas.
    C'est normal et Jipété a raison. Le fichier est hidapi.dll. Et sa dernière version est à l'adresse suivante : https://github.com/libusb/hidapi/rel.../hidapi-0.14.0.

    Et je confirme que ça fonctionne très bien avec Lazarus Windows 64 bits (pas essayé 32 bits).

    bb

  14. #14
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Peut-être parce que ce fichier n'existe pas ? D'où sors-tu ce nom ?
    Je sors ce nom de l'unité hidapi.pas où il y est fait référence à la ligne 34 et utilisé des lignes 91 à 108 :

    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
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    { HIDAPI.pas - Bindings for libhidapi
     
      Copyright (C) 2016 Bernd Kreuss <prof7bit@gmail.com>
     
      This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General
      Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option)
      any later version with the following modification:
     
      As a special exception, the copyright holders of this library give you permission to link this library with
      independent modules to produce an executable, regardless of the license terms of these independent modules,and to
      copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each
      linked independent module, the terms and conditions of the license of that module. An independent module is a module
      which is not derived from or based on this library. If you modify this library, you may extend this exception to
      your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception
      statement from your version.
     
      This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
      details.
     
      You should have received a copy of the GNU Library General Public License along with this library; if not, write to
      the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    }
    unit hidapi;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, ctypes;
     
    const
      LIBHIDAPI = 'hidapi-libusb';
     
    type
      PCWChar = ^TCWChar;
      TCWChar = UCS4Char;  // wchar_t of size 4 (NOT ON WINDOWS!)
     
      TCWCharArray = array of TCWChar;
     
      { THidDevice }
     
      PHidDevice = ^THidDevice;
      THidDevice = object
        function Write(const Data; Length: SizeInt): SizeInt;
        function Read(out Data; Length: SizeInt): SizeInt;
        function ReadTimeout(out Data; Length: SizeInt; Millis: Integer): SizeInt;
        function SetNonBlocking(NonBlock: Integer): Integer;
        function SendFeatureReport(const Data; Length: SizeInt): SizeInt;
        function GetFeatureReport(out Data; Length: SizeInt): SizeInt;
        function GetManufacturerString: UnicodeString;
        function GetProductString: UnicodeString;
        function GetSerialNumberString: UnicodeString;
        function GetIndexedString(Index: Integer): UnicodeString;
        procedure Close;
        function Open(VID: Word; PID: Word; Serial: UnicodeString): PHidDevice; static;
        function OpenPath(Path: String): PHidDevice; static;
      end;
     
      { THidDeviceInfo }
     
      PHidDeviceInfo = ^THidDeviceInfo;
      THidDeviceInfo = object
        Path: PChar;
        VendorID: Word;
        ProductID: Word;
        SerialNumber: PCWChar;
        ReleaseNumber: Word;
        ManufacturerString: PCWChar;
        ProductString: PCWChar;
        UsagePage: Word;
        Usage: Word;
        InterfaceNumber: cint;
        Next: PHidDeviceInfo;
        function Enumerate(VID: Word; PID: Word): PHidDeviceInfo; static;
        procedure Free;
      end;
     
      function HidInit: Integer;
      function HidExit: Integer;
     
      function PCWCharToUnicodeString(P: PCWChar): UnicodeString;
     
     
    implementation
     
     
    { imported external API functions }
     
    function hid_init: cint; cdecl; external LIBHIDAPI;
    function hid_exit: cint; cdecl; external LIBHIDAPI;
    function hid_enumerate(vendor_id: Word; product_id: Word): PHidDeviceInfo; cdecl; external LIBHIDAPI;
    procedure hid_free_enumeration(devs: PHidDeviceInfo); cdecl; external LIBHIDAPI;
    function hid_open(vendor_id: Word; product_id: Word; serial_number: PCWChar): PHidDevice; cdecl; external LIBHIDAPI;
    function hid_open_path(path: PChar): PHidDevice; cdecl; external LIBHIDAPI;
    function hid_write(device: PHidDevice; data: Pointer; length: SizeInt): cint; cdecl; external LIBHIDAPI;
    function hid_read_timeout(device: PHidDevice; data: Pointer; length: SizeInt; millisec: cint): cint; cdecl; external LIBHIDAPI;
    function hid_read(device: PHidDevice; data: Pointer; length: SizeInt): cint; cdecl; external LIBHIDAPI;
    function hid_set_nonblocking(device: PHidDevice; nonblock: cint): cint; cdecl; external LIBHIDAPI;
    function hid_send_feature_report(device: PHidDevice; data: Pointer; length: SizeInt): cint; cdecl; external LIBHIDAPI;
    function hid_get_feature_report(device: PHidDevice; data: Pointer; length: SizeInt): cint; cdecl; external LIBHIDAPI;
    procedure hid_close(device: PHidDevice); cdecl; external LIBHIDAPI;
    function hid_get_manufacturer_string(device: PHidDevice; str: PCWChar; maxlen: SizeInt): cint; cdecl; external LIBHIDAPI;
    function hid_get_product_string(device: PHidDevice; str: PCWChar; maxlen: SizeInt): cint; cdecl; external LIBHIDAPI;
    function hid_get_serial_number_string(device: PHidDevice; str: PCWChar; maxlen: SizeInt): cint; cdecl; external LIBHIDAPI;
    function hid_get_indexed_string(device: PHidDevice; string_index: cint; str: PCWChar; maxlen: SizeInt): cint; cdecl; external LIBHIDAPI;
    function hid_error(device: PHidDevice): PCWChar; cdecl; external LIBHIDAPI;
     
     
    { helper functions for dealing with widechar strings }
     
    function PCWCharToUnicodeString(P: PCWChar): UnicodeString;
    var
      L: Integer;
      WS: array of TCWChar;
     
    begin
      if not Assigned(P) then
        exit('');
     
      // strlen
      L := 0;
      while P[L] <> 0 do begin
        Inc(L);
      end;
     
      // make a copy including the terminating zero
      Inc(L);
      SetLength(WS, L);
      Move(P^, WS[0], L * SizeOf(TCWChar));
     
      // for 4-Byte chars we can convert with
      // the existing UCS4 function.
      // NOT SO ON WINDOWS!
      Result := UCS4StringToUnicodeString(WS);
    end;
     
    function UnicodeStringToTCWCharNullterminated(S: UnicodeString): TCWCharArray;
    begin
      // the chars are of size 4, so we
      // can use the UCS4 functions
      // NOT SO ON WINDOWS!
      Result := UnicodeStringToUCS4String(S);
    end;
     
    { Initialize and deinitialize the HIDAPI }
     
    function HidInit: Integer;
    begin
      Result :=  hid_init;
    end;
     
    function HidExit: Integer;
    begin
      Result :=  hid_exit;
    end;
     
    { THidDeviceInfo }
     
    function THidDeviceInfo.Enumerate(VID: Word; PID: Word): PHidDeviceInfo;
    begin
      Result :=  hid_enumerate(VID, PID);
    end;
     
    procedure THidDeviceInfo.Free;
    begin
      hid_free_enumeration(@Self);
    end;
     
    { THidDevice }
     
    function THidDevice.Write(const Data; Length: SizeInt): SizeInt;
    begin
      Result := hid_write(@self, @Data, Length);
    end;
     
    function THidDevice.Read(out Data; Length: SizeInt): SizeInt;
    begin
      Result :=  hid_read(@Self, @Data, Length);
    end;
     
    function THidDevice.ReadTimeout(out Data; Length: SizeInt; Millis: Integer): SizeInt;
    begin
      Result :=  hid_read_timeout(@Self, @Data, Length, Millis);
    end;
     
    function THidDevice.SetNonBlocking(NonBlock: Integer): Integer;
    begin
      Result := hid_set_nonblocking(@Self, NonBlock);
    end;
     
    function THidDevice.SendFeatureReport(const Data; Length: SizeInt): SizeInt;
    begin
      Result :=  hid_send_feature_report(@Self, @Data, Length);
    end;
     
    function THidDevice.GetFeatureReport(out Data; Length: SizeInt): SizeInt;
    begin
      Result :=  hid_get_feature_report(@Self, @Data, Length);
    end;
     
    function THidDevice.GetManufacturerString: UnicodeString;
    var
      Buf: array[0..255] of TCWChar;
    begin
      hid_get_manufacturer_string(@Self, @Buf, Length(Buf) - 1);
      Result := PCWCharToUnicodeString(@Buf);
    end;
     
    function THidDevice.GetProductString: UnicodeString;
    var
      Buf: array[0..255] of TCWChar;
    begin
      hid_get_product_string(@Self, @Buf, Length(Buf) - 1);
      Result := PCWCharToUnicodeString(@Buf);
    end;
     
    function THidDevice.GetSerialNumberString: UnicodeString;
    var
      Buf: array[0..255] of TCWChar;
    begin
      hid_get_serial_number_string(@Self, @Buf, Length(Buf) - 1);
      Result := PCWCharToUnicodeString(@Buf);
    end;
     
    function THidDevice.GetIndexedString(Index: Integer): UnicodeString;
    var
      Buf: array[0..255] of TCWChar;
    begin
      hid_get_indexed_string(@Self, Index, @Buf, Length(Buf) - 1);
      Result := PCWCharToUnicodeString(@Buf);
    end;
     
    procedure THidDevice.Close;
    begin
      hid_close(@Self);
    end;
     
    function THidDevice.Open(VID: Word; PID: Word; Serial: UnicodeString): PHidDevice;
    var
      WS: TCWCharArray;
    begin
      WS := UnicodeStringToTCWCharNullterminated(Serial);
      if Length(WS) > 1 then
        Result := hid_open(VID, PID, @WS[0])
      else
        Result := hid_open(VID, PID, nil);
    end;
     
    function THidDevice.OpenPath(Path: String): PHidDevice;
    begin
      Result :=  hid_open_path(PChar(Path));
    end;
     
    initialization
      HidInit;
    finalization
      HidExit;
    end.
    Cordialement.

    Pierre.

  15. #15
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par bb84000 Voir le message
    ... C'est normal et Jipété a raison. Le fichier est hidapi.dll. Et sa dernière version est à l'adresse suivante : https://github.com/libusb/hidapi/rel.../hidapi-0.14.0. ...
    J'ai téléchargé ce dossier, mais aucune dll n'y figure.

    Citation Envoyé par bb84000 Voir le message
    ... Et je confirme que ça fonctionne très bien avec Lazarus Windows 64 bits ...
    Avec quelle application as-tu validé ce fonctionnement ?

    Cordialement.

    Pierre.

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 930
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 930
    Points : 15 375
    Points
    15 375
    Par défaut
    Bonjour,

    si je récupère l'archive "source code (zip)" ici https://github.com/libusb/hidapi/rel.../hidapi-0.14.0 et que je l'ouvre avec un visualiseur de zips, je trouve dedans un dossier libusb, alors j'y vais voir et je n'y trouve que des Makefile pour Linux et similaires, et rien pour Windows...

    si je récupère l'autre archive "hidapi-win.zip", on y trouve des fichiers hidapi.tout_ce_que_tu_veux mais pas de hidapi-libusb.

    On dirait que -libusb ne concerne PAS windows.
    Maintenant, pourquoi est-ce que c'est dans le fichier sans autre explication, pas la moindre idée...

    Mais regarde bien la page que je t'indique : on y trouve
    Released hidapi-win.zip includes pre-compiled:

    hidapi.dll
    hidapi.lib

    For x86 and x64 Windows platforms.
    And header file(s) for it.

    Tiens, va donc fouiller là : https://libusb.info/hidapi/index.html

  17. #17
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Bonsoir,

    Ayant chargé cette application, je l'ai un peu modifiée pour la rendre visuelle (utilisation d'un TMemo à la place des Writeln).
    J'ai modifié l'unité hidapi.pas pour accepter la dll : hidapi.dll :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {$IFDEF UNIX}
      LIBHIDAPI = 'hidapi-libusb';
    {$ENDIF}
    {$IFDEF WINDOWS}
      LIBHIDAPI = 'hidapi';
    {$ENDIF}
    Ça compile et s'exécute aussi bien sous Windows qu'Ubuntu. Pour autant les résultats sont différents :

    Sous Ubuntu, j'obtiens de ligne compréhensible, mais je tombe sur "'could not open device'" dans la procédure "OpenAndReadDemo", pourquoi ?

    Sous Windows 10, les lignes dans le TMemo sont remplies de caractères bizarres. J'ai été obligé de "commenter" les lignes 97 à 102 de l'unité "Fntr.pas" car la fonction Num:= Device.Read(Buffer, SizeOf(Buffer)); ne répondait pas ; le programme ne se poursuivait pas, pourquoi ?

    Donc, en l’état, je suis un peu (voire beaucoup) bloqué.

    Si vous avez quelques temps pour voir ce qui se passe ...

    Cordialement.

    Pierre.HIDAPI.zip

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 930
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 930
    Points : 15 375
    Points
    15 375
    Par défaut
    J'ai récupéré ton zip et l'ai extrait dans un dossier.
    J'y ai trouvé des .res, reliquats de compils échouées, pas important.

    Plus costaud, j'ai ouvert le README et là je suis resté sur le Q : personne n'a vu les lignes 4 et 6 ?
    Je les remets :
    ## only Linux (or other *ixes)

    This does not (yet) work on Windows, it assumes sizeof(wchar_t) == 4 and this is not true on Windows.
    Cette partie va être tendue...

    Allez, je regarde la linux.

  19. #19
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 930
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 930
    Points : 15 375
    Points
    15 375
    Par défaut
    Si c'est là-dedans que ça coince
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function THidDevice.Open(VID: Word; PID: Word; Serial: UnicodeString): PHidDevice;
    var
      WS: TCWCharArray;
    begin
      WS := UnicodeStringToTCWCharNullterminated(Serial);
      if Length(WS) > 1 then
        Result := hid_open(VID, PID, @WS[0])
      else
        Result := hid_open(VID, PID, nil);
    end;
    je n'ai pas trop d'idée, d'autant plus que pour faire une compil il nous faut rajouter des choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo apt-get install libudev-dev libusb-1.0-0-dev libfox-1.6-dev
    .

    Alors au pif, maintenant que chez toi ça compile, est-ce que les différents essais précédents n'auraient pas mis la pagaille dans la pile USB ? Auquel cas un reboot pourrait régler le souci.
    Sous Linux.
    Et il faudrait aller voir dans la source LIBHIDAPI (elle est dispo ?) ce que fait la proc hid_open.

    Sous Windows, je ne vois pas trop, je n'ai plus de Windows (sauf en machines virtuelles, qui risquent d'embrouiller les choses).

  20. #20
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ...
    En effet, l'auteur dit ne pas avoir pu tester sous Windows. Il semble que ce soit dû à ces différents tableaux de caractères, chaînes, ... à gérer.

    Sous Ubuntu, je ne pense pas que le problème vienne de la pile USB car j'ai sans arrêt fait des aller/retour entre Windows et Ubuntu donc, reboot à chaque fois.

    Ce que j'aimerais comprendre est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      UCS4Char            = type 0..$10ffff;
    afin de pouvoir donner une valeur à WS dans la fonction : THidDevice.Open

    Cordialement.

    Pierre.

Discussions similaires

  1. Transmission de données via une liaison port USB
    Par samuela dans le forum MATLAB
    Réponses: 0
    Dernier message: 10/08/2014, 21h51
  2. Internet sous linux via une clé usb 3G sous windows
    Par aperrin dans le forum Réseau
    Réponses: 1
    Dernier message: 19/05/2010, 20h05
  3. Réponses: 4
    Dernier message: 20/04/2009, 19h49
  4. Installer XP via une clé usb ?
    Par cimbomlu dans le forum Windows XP
    Réponses: 4
    Dernier message: 09/10/2006, 10h41
  5. comment établir une liaison usb sous visual c++ ?
    Par Baby_Chou dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2005, 08h31

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