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

C++Builder Discussion :

Comment ouvrir le bon port série ?


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut Comment ouvrir le bon port série ?
    Bonjour,

    j'ai commencé à écrire un "bout" de fonction qui cherche à ouvrir et à configurer le port série associé au matériel branché sur le pc.

    Je m'explique : je branche le matériel sur le pc en usb, je lance l'application, je clique sur le bouton "Connexion" et l'application détecte et ouvre le bon port série auquel j'ai connecté le matériel.

    Voici le "bout" de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    AnsiString COM;
    	while (hdl == INVALID_HANDLE_VALUE)
    	{
     
     
    		for (int n=1;n<=255;n++){
    				COM="COM"+AnsiString(n);
     
    	hdl = CreateFile(COM.c_str()                ,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
     
    		}
           }

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Si tu veux que le code fonctionne avec les ports plus haut que 9 il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    COM="\\\\.\\COM"+AnsiString(n);
    Pour plus de détail va lire: http://support.microsoft.com/?id=115831

    Pour énumérer les port série disponible sur ton PC va voir:
    http://support.microsoft.com/kb/259695
    Et avec la commande SetupDiGetDeviceRegistryProperty tu peux en profiter pour prendre des informations sur ton périphérique USB (je pense avoir compris qu'il s'agit d'un "Virtual COM Port to USB"). Si c'est le cas tu n'as qu'a lire le SPDRP_HARDWAREID: http://msdn.microsoft.com/en-us/library/ms792967.aspx

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Pinaise !!!!

    Je trouve cela un peu compliqué quand même !!!

    J'ai une erreur "getcommstate" maintenant.
    Je voudrai juste que lorsque je clique sur mon bouton "connexion", ça trouve et ouvre automatiquement le port série USB du module que j'ai connecté !!!!
    Je sais que le port est le "COM3" sur mon PC mais sur d'autres PC ça change !!!


  4. #4
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut, pourrais-tu donner plus de détail sur ton erreur?
    Je voudrais aussi voir ton code et connaître le HARDWARE ID de ton truc USB. Si tu ne connais pas, tu peux mettre aussi le contenu de ton fichier INF dans ton message.

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut c_boireau
    J'ai adapte et essaye le code MSN fourni par Crayon
    le code
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include <stdio.h>
    #include <windows.h>
    #include <setupapi.h>
    #include <devguid.h>
    #include <regstr.h>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
           HDEVINFO hDevInfo;
           SP_DEVINFO_DATA DeviceInfoData;
           DWORD i;
           // Create a HDEVINFO with all present devices.
           hDevInfo = SetupDiGetClassDevs(NULL,
               0, // Enumerator
               0,
               DIGCF_PRESENT | DIGCF_ALLCLASSES );
     
           if (hDevInfo == INVALID_HANDLE_VALUE)
           {
               // Insert error handling here.
    //           return ;
           }
     
           // Enumerate through all devices in Set.
     
           DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
           for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
               &DeviceInfoData);i++)
           {
               DWORD DataT;
               LPTSTR buffer = NULL;
               DWORD buffersize = 0;
     
               //
               // Call function with null to begin with, 
               // then use the returned buffer size (doubled)
               // to Alloc the buffer. Keep calling until
               // success or an unknown failure.
               //
               //  Double the returned buffersize to correct
               //  for underlying legacy CM functions that 
               //  return an incorrect buffersize value on 
               //  DBCS/MBCS systems.
               // 
               while (!SetupDiGetDeviceRegistryProperty(
                   hDevInfo,
                   &DeviceInfoData,
                   SPDRP_DEVICEDESC,
                   &DataT,
                   (PBYTE)buffer,
                   buffersize,
                   &buffersize))
               {
                   if (GetLastError() ==
                       ERROR_INSUFFICIENT_BUFFER)
                   {
                       // Change the buffer size.
                       if (buffer) LocalFree(buffer);
                       // Double the size to avoid problems on 
                       // W2k MBCS systems per KB 888609.
                       // soit
    //                   buffer = (char*)LocalAlloc(LPTR, buffersize * 2);
                       // ou
                       buffer = (PCHAR)LocalAlloc(LPTR, buffersize * 2);
                   }
                   else
                   {
                       // Insert error handling here.
                       break;
                   }
               }
    //           printf("Result:[%s]\n",buffer);
               Memo1->Lines->Add(buffer);
               if (buffer) LocalFree(buffer);
           }
     
     
           if ( GetLastError()!=NO_ERROR &&
                GetLastError()!=ERROR_NO_MORE_ITEMS )
           {
               // Insert error handling here.
    //           return ;
           }
     
           //  Cleanup
           SetupDiDestroyDeviceInfoList(hDevInfo);
     Memo1->Lines->Add("nb perifs" );
     Memo1->Lines->Add(i);
    //       return ;
    }
    Ce code fournit la liste de tous les periferiques, je ne sais pas si c'est ce que tu recherche

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Ce code fournit la liste de tous les periferiques, je ne sais pas si c'est ce que tu recherche
    Comment ça ?
    Ce code détecte tous les périphériques qui sont raccordés au PC ?

    Ce que j'aimerai c'est qu'en appuyant sur un bouton ("connexion" par exemple), le programme détecte ensuite le périphérique associé au port USB du PC et ouvre ce port, ... etc


  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Pour detecter l'insertion ou le retrait d'un periferique
    le .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
    20
    21
    22
    23
    24
    25
    26
    27
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TLabel *Label1;
    private: // User declarations
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
    // module de detection des messages
            void   __fastcall   TForm1::GetDeviceChange(TMessage &Msg);
            BEGIN_MESSAGE_MAP
                    MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,GetDeviceChange)
            END_MESSAGE_MAP(TForm)
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    Le .cpp
    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
     
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void   __fastcall   TForm1::GetDeviceChange(TMessage &Msg)
    {
    Label1->Caption = "OK";
    // le code 
    }
    Pour la gestion du periferique voir du cote de " dbt.h "

  8. #8
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    c_boireau si la réponse de blondelle ne te convient pas, il faudrait répondre aux questions que j'ai posé plus haut.

    Si tu veux seulement les périphériques reconnu comme port série dans le code de blondelle au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           hDevInfo = SetupDiGetClassDevs(NULL,
               0, // Enumerator
               0,
               DIGCF_PRESENT | DIGCF_ALLCLASSES );
    tu dois utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_PORTS,
               0, // Enumerator
               0,
               DIGCF_PRESENT);
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEFINE_GUID( GUID_DEVCLASS_PORTS,               0x4d36e978L, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 );
    Pour une liste complète des "Devices" tu peux aller voir le site Web suivant: http://msdn.microsoft.com/en-us/library/ms791134.aspx

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TFormClient::Connexion1Click(TObject *Sender)
    {
    	LeThread->Resume();
    }
    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
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
     
    void __fastcall MyThread::Execute()
    {
    	SetName();
    	//---- Placer le code du thread ici ----
     
    	setlocale( LC_NUMERIC, "French_France" );
     
    	DCB dcb;
    	bool etat;
    	COMMTIMEOUTS timeouts={0};
    	unsigned char buf [20];
    	unsigned long nblu;
     
     
    	FILE *fichier;
     
     
    	while (hdl == INVALID_HANDLE_VALUE)
    	{
     
     
    		for (int n=1;n<=255;n++){
    			AnsiString COM="\\\\.\\COM"+AnsiString(n);
     
    			hdl = CreateFile(COM.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
     
    		}
    	}
     
     
     
     
    	//FormClient->hdl = CreateFile(FormClient->Port.c_str() ,GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
     
    	/*if (FormClient->hdl == INVALID_HANDLE_VALUE)
    	{
    		//printf("erreur %d\n",GetLastError());
     
    		//return (1);
    		ShowMessage ("erreur Ouverture COM");
    	}
    	else*/
    	//{
     
    		FormClient->Connexion1->Enabled = false;
    		FormClient->Deconnexion1->Enabled = true;
     
    		SetupComm(hdl,5000,5000);
    		//printf ("Ouverture COM reussie !\n\n");
    		//ShowMessage ("Ouverture COM réussie");
    		etat=GetCommState(hdl, &dcb);
     
    		if (etat==false)
    		{
    			//printf ("GetCommState erreur %d\n", GetLastError());
    			//return (2);
    			ShowMessage ("erreur GetCommState");
    			Terminate();
    		}
    		else
    		{
    			//printf ("GetCommState reussie\n\n");
    			//ShowMessage ("GetCommState réussie");
     
            }
     
     
     
    		dcb.BaudRate = CBR_38400;
    		dcb.ByteSize = 8;
    		dcb.Parity = NOPARITY;
    		dcb.StopBits = ONESTOPBIT;
     
     
    		etat=SetCommState(hdl,&dcb);
     
    		if (etat==false)
    		{
    			//printf ("SetCommState erreur %d\n", GetLastError());
    			//Sleep (2000);
    			//return (3);
    			ShowMessage ("erreur SetCommState");
    		}
    		else
    		{
    			//printf ("Vitesse : %d baud\n", dcb.BaudRate);
    			//printf ("Bits de donnees : %d bits\n", dcb.ByteSize);
    			//printf ("Parite : %s\n", dcb.Parity);
    			//printf ("Bits de stop : 1 bit\n\n");
     
    			//printf ("Com serie configuree !\n\n");
    			//Sleep (2000);
    			//ShowMessage ("Com serie configuree !");
    		}
     
    		int TimeoutRead=500;
    		timeouts.ReadIntervalTimeout=MAXWORD;
    		timeouts.ReadTotalTimeoutMultiplier=0;
    		timeouts.ReadTotalTimeoutConstant=TimeoutRead;
    		timeouts.WriteTotalTimeoutMultiplier=0;
    		timeouts.WriteTotalTimeoutConstant=0;
     
    		etat=SetCommTimeouts(hdl,&timeouts);
     
    		if (etat==false)
    		{
    			//printf ("TimeOuts erreur %d\n", GetLastError());
    			//return (4);
    			ShowMessage ("Erreur TimeOuts");
    		}
    		else
    		{
    			//printf ("TimeOuts initialises\n\n");
    			//ShowMessage ("TimeOuts initialisés");
     
    		}
     
     
    	    int i=1;
     
     
    		while (1)
    		{
     
    			if (Suspended == true )
    			{
     
    				//Terminate();
    				CloseHandle(hdl);
     
                }
    			else
    			{
     
     
    			ReadFile(hdl,buf,sizeof (buf),&nblu,NULL);
    			if (etat==-1)
    			{
    				//printf ("Erreur lecture port : erreur %d\n\n", GetLastError());
    				ShowMessage ("Erreur lecture port");
    			}
     
     
     
     
    			if (nblu==18)
    			{
     
    				//for (buf [i]; i < 18; i++)
    				//{
    					//printf ("Octets lus %d: %X\n\n", i, buf[i]);
     
     
     
     
    				//}
     
     
    				TDateTime Date;
    				Date = Now();
    				ShortDateFormat = "dd.mm.yyyy";
    				//LongTimeFormat = "hh'h'nn'm'";
    				LongTimeFormat = "hhnn";
    				AnsiString nom = "C:\\Users\\Olivier\\Desktop\\" + Date.DateString() + "-" + ((buf[4] << 16) + (buf[5] << 8) + buf[6]) + ".gm";
     
     
    				fichier = fopen (nom.c_str() ,"a+");
    				if (fichier==NULL)
    				{
    					//printf ("Erreur creation fichier : erreur %d\n\n", GetLastError());
    					ShowMessage ("Erreur création fichier");
    				}
    				//else
    				//{
    					//printf ("Creation fichier reussie\n\n");
    					//ShowMessage ("Création fichier réussie");
    				//}
     
     
     
     
    				// Numéro de série
     
    				int j=0;
    				rewind(fichier);
     
    				// Boucle de lecture des caractères un à un
    				while (fgetc(fichier) != EOF)
    				{
     
    					j++;
    				}
     
     
    				if (j==0)
    				{
    					fprintf (fichier, "\n\n");
    					fprintf (fichier, "%X",  buf[4]);
    					fprintf (fichier, "%X",  buf[5]);
    					fprintf (fichier, "%X",  buf[6]);
    				}
     
     
     
     
    					// Mesure du PH
     
    					fprintf (fichier, "\n%.2f", (float)buf[9]/10.0);
    					fprintf (fichier, " ");
    					FormClient->FastLineSeriePH->AddXY( i, ((float) buf [9]/10.0), i, clBlue);
     
    					// Mesure de la conductivité
     
    					if ( buf[12] != 0)
    					{
     
    						short int conductivite = ( buf[12]*256 + buf [11]);
     
    						fprintf (fichier, "%.2f", (float) conductivite/10.0);
     
     
    						fprintf (fichier, " ");
    						FormClient->FastLineSerieConductivite->AddXY( i, (float) (conductivite/10.00) , i, clGreen);
    					}
    					else
    					{
    					fprintf (fichier, "%.2f", (float)buf[11]/10.0);
    					fprintf (fichier, " ");
    					FormClient->FastLineSerieConductivite->AddXY( i, ((float) buf [11]/10.00), i, clGreen);
    					}
     
    					// Mesure de la température
     
    					if ( buf[14] != 0)
    					{
     
    						short int temp = ( buf[14]*256 + buf [13]);
     
    						fprintf (fichier, "%.1f", (float) (temp/10.0));
     
     
    						fprintf (fichier, " ");
    						FormClient->FastLineSerieTemperature->AddXY( i, (float) (temp/10.0) , i, clRed);
    					}
    					else
    					{
    					fprintf (fichier, "%.1f", (float)buf[13]/10.0);
    					fprintf (fichier, " ");
    					FormClient->FastLineSerieTemperature->AddXY( i, ((float) buf [13]/10.0), i, clRed);
    					}
     
     
     
     
    					fprintf (fichier, "%s" , Date.TimeString() );
     
     
     
    					//printf ("Stockage \n\n");
    					//ShowMessage ("Stockage ");
    					//FormClient->FileListBoxFichiers->Update();
     
    					fclose (fichier);
    					i++;
     
    			 }
     
                 }
     
    		}
     
     
     
     
     
     
     
    	//}
     
     
     
    	//return 0;
     
    }

  10. #10
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Est-ce que ton truc USB possède un fichier inf pour installer les pilotes (driver)?

    Normalement quand tu installes un périphérique USB ses informations se retrouve dans le registre a cet endroit:
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB
    Vid = Vendor ID
    Pid = Product ID

    Les fonctions de type SetupDi... vont lire dans le registre.

    Donc, si tu possède pas de fichier inf il faudra que tu trouve toi même les information sur ton produit, soit tu ouvres regedit ou que tu utilises le code plus haut pour avoir les informations sur ton périphérique USB. Ensuite avec le code blondelle (celui qui énumère) tu fais une boucle jusqu'à ce que tu trouve ton hardware.

    Ensuite tu trouves ton port série:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        HKEY hKey;
        unsigned char szPortName[256] = "";
        DWORD len = 256;
     
            hKey = SetupDiOpenDevRegKey(hDevInfo, &DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
            RegQueryValueEx(hKey, "PortName", NULL, NULL, szPortName, &len);
            RegCloseKey(hKey);
    Et tu l'ouvre avec la fonction CreateFile!

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Bonjour,

    j'ai cherché dans la base de registre et j'ai des news concernant mon driver USB : VID_0403&PID_6001

    C'est un chip ftdi232BL !

    Que dois je faire maintenant avec ces informations ?


  12. #12
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Wow, si tu as les pièces d'un casse-tête sans la boîte avec l'image tu n'es pas capable de l'assembler seul! Tout les morceau de code sont ici pour que tu puisses le faire. Laisse moi t'aider en plaçant deux trois morceaux pour toi:
    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
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include <stdio.h>
    #include <windows.h>
    #include <setupapi.h>
    #include <devguid.h>
    #include <regstr.h>
    //---------------------------------------------------------------------------
    DEFINE_GUID( GUID_DEVCLASS_PORTS,               0x4d36e978L, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 );
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
           HDEVINFO hDevInfo;
           SP_DEVINFO_DATA DeviceInfoData;
           DWORD i;
           // Create a HDEVINFO with all present devices.
           hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_PORTS,
               0, // Enumerator
               0,
               DIGCF_PRESENT);
     
           if (hDevInfo == INVALID_HANDLE_VALUE)
           {
               // Insert error handling here.
    //           return ;
           }
     
           // Enumerate through all devices in Set.
     
           DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
           for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
               &DeviceInfoData);i++)
           {
               DWORD DataT;
               LPTSTR buffer = NULL;
               DWORD buffersize = 0;
     
               //
               // Call function with null to begin with, 
               // then use the returned buffer size (doubled)
               // to Alloc the buffer. Keep calling until
               // success or an unknown failure.
               //
               //  Double the returned buffersize to correct
               //  for underlying legacy CM functions that 
               //  return an incorrect buffersize value on 
               //  DBCS/MBCS systems.
               // 
               while (!SetupDiGetDeviceRegistryProperty(
                   hDevInfo,
                   &DeviceInfoData,
                   SPDRP_HARDWAREID,
                   &DataT,
                   (PBYTE)buffer,
                   buffersize,
                   &buffersize))
               {
                   if (GetLastError() ==
                       ERROR_INSUFFICIENT_BUFFER)
                   {
                       // Change the buffer size.
                       if (buffer) LocalFree(buffer);
                       // Double the size to avoid problems on 
                       // W2k MBCS systems per KB 888609.
                       // soit
    //                   buffer = (char*)LocalAlloc(LPTR, buffersize * 2);
                       // ou
                       buffer = (PCHAR)LocalAlloc(LPTR, buffersize * 2);
                   }
                   else
                   {
                       // Insert error handling here.
                       break;
                   }
               }
     
               // On véréfie si c'est le bon hardware
                if(strnicmp(buffer, "USB\\VID_0403&PID_6001", 21) == 0)
                {
                    HKEY hKey;
                    char szPortName[256] = "";
                    DWORD len = 256;
     
                    hKey = SetupDiOpenDevRegKey(hDevInfo, &DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
                    RegQueryValueEx(hKey, "PortName", NULL, NULL, szPortName, &len);
                    RegCloseKey(hKey);
     
                    AnsiString COM = "\\\\.\\" + AnsiString(szPortName);
     
                    Memo1->Lines->Add("Il faut me connecter à " + COM);
     
                    /****************************************************
                     * Ici tu te connecte avec: CreateFile(COM.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
                     *******************************************************/ 
                }
     
               Memo1->Lines->Add(buffer);
               if (buffer) LocalFree(buffer);
           }
     
     
           if ( GetLastError()!=NO_ERROR &&
                GetLastError()!=ERROR_NO_MORE_ITEMS )
           {
               // Insert error handling here.
    //           return ;
           }
     
           //  Cleanup
           SetupDiDestroyDeviceInfoList(hDevInfo);
     Memo1->Lines->Add("Nb perifs " + AnsiString(i));
    //       return ;
    }
    Il manque sans doute des morceaux, mais la logique y est.

    Ne te gêne pas pour mettre des "break point" et d'exécuter étape par étape le code au niveau de la détection du hardware. Peut-être que la string que je compare n'est pas bonne, à toi de vérifier.

    Si tu as d'autres questions, est que tu peux mettre ton code (code ci-haut modifié).

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Merci beaucoup Crayon, mais lorsque je veux compiler et lancer le programme, une fenêtre apparait en me disant d'importer des packages ".bpi" (XMLBBoxD11.bpi, ...) !!!

    Qu'est ce que cela veut dire ???


  14. #14
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Le code de Crayon compile et fonctionne tres bien chez moi sans modifs

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Oui, j'ai réussi a solutionner le problème !

    Par contre, dans son code :
    /****************************************************
    * Ici tu te connecte avec: CreateFile(COM.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    *******************************************************/
    Est ce bien ici qu'il faut que je fasse l'ouverture de mon port et le traitement associé ?

    Car je n'ai pas l'impression que mon ouverture de port fonctionne et " Memo1->Lines->Add("Il faut me connecter à " + COM);" cette ligne n'apparait pas dans mon mémo !!!!


  16. #16
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Citation Envoyé par petitclem Voir le message
    Car je n'ai pas l'impression que mon ouverture de port fonctionne et " Memo1->Lines->Add("Il faut me connecter à " + COM);" cette ligne n'apparait pas dans mon mémo !!!!
    Il faut modifier la ligne suivante pour que se soit ton hardware à l'intérieur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strnicmp(buffer, "USB\\VID_0403&PID_6001", 21) == 0)
    Si tu ne sais pas de quoi je parle, met exactement le contenu de ton Memo sur ton prochain post. Si tu ne le fais pas, je ne pourrais pas t'aidé d'avantage.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    Bonjour,

    le contenu de mon mémo est le suivant :

    FTDIBUS\COMPORT&VID_0403&PID_6001
    Nb perifs 1

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    C'est ok, ça fonctionne bien, merci !!!!

    Si c'est un driver de communication différent, puis je faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if((strnicmp(buffer, "FTDIBUS\\COMPORT&VID_0403&PID_6001" , 21))
    			|| (strnicmp(buffer, "USB\\VID_10C4&PID_EA60&REV_0100", 21)) == 0)
    {     ..........
     
     
    }

    Car j'ai essayé et je n'ai pas l'impression que cela fonctionne !!!


  19. #19
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut, si tu veux tu peux faire simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(stricmp(buffer, "FTDIBUS\\COMPORT&VID_0403&PID_6001") == 0)
    {
     
    }
    Description de stricmp venant de l'aide:
    Compares one string to another, without case sensitivity.

    stricmp performs an unsigned comparison of s1 to s2, starting with the first character in each string and continuing with subsequent characters until the corresponding characters differ or until the end of the strings is reached. The comparison is not case sensitive.

    It returns a value (< 0, 0, or > 0) based on the result of comparing s1 (or part of it) to s2 (or part of it).

    The routines stricmp and strcmpi are the same; strcmpi is implemented through a macro in string.h that translates calls from strcmpi to stricmp. Therefore, in order to use stricmp, you must include the header file string.h for the macro to be available.

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    ok, merci mais en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if((stricmp(buffer, "FTDIBUS\\COMPORT&VID_0403&PID_6001"))
    					|| (stricmp(buffer, "USB\\VID_10C4&PID_EA60&REV_0100")) == 0)
    {
    .........
     
    }
    ça ne fonctionne pas !Je fais des tests en branchant un matériel avec le driver "USB\\VID_10C4&PID_EA60&REV_0100" et là c'est bon mais lorsque je relance l'application pour faire un test avec le deuxième matériel "FTDIBUS\\COMPORT&VID_0403&PID_6001" ça ne marche pas !


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment ouvrir tous les ports
    Par bmarcellin71 dans le forum Hardware
    Réponses: 5
    Dernier message: 08/02/2014, 16h08
  2. comment écouter sur un Port série spécifique
    Par sebac dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 06/01/2010, 14h22
  3. Trouver le bon port série
    Par RR instinct dans le forum C++
    Réponses: 1
    Dernier message: 27/11/2006, 18h22
  4. COMMENT OUVRIR LE PORT 1433
    Par nil dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/03/2006, 11h18
  5. Comment écouter un port série avec flash ?
    Par Alex01 dans le forum Flash
    Réponses: 11
    Dernier message: 07/10/2005, 16h11

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