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++ Discussion :

Lister les ports série disponibles


Sujet :

C++

  1. #1
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut Lister les ports série disponibles
    Salut,

    je cherche à récupérer la liste des port série qui sont disponible,
    est-ce qu'il y a un moyen simple qui fournie directement cette liste comme sous VB avec My.Computer.Ports.SerialPortNames?

    J'ai trouvé des exemples ou il faut aller chercher l'info dans les clés registre mais c'est pour C++builder mais je travaille sous Visual C++.

    Est-ce que quelqu'un a déjà fait ça?

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Va voir sur cette page, par exemple. Il existe d'autres méthodes d'énumération, mais c'est plus pour trouver les ports série "planqués" ou non standards.

    L'utilisation des clés de registre sous Visual C++ ne diffère pas beaucoup de C++ Builder : dans les deux cas, en général, tu tapes directement dans l'API Win32.

    Sinon, va sur MSDN voir l'aide de RegOpenKey et les exemples qui vont avec.

  3. #3
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    Ok merci je vais essayer de reprendre l'exemple sous builder et de le modifier en fonction de se que dit msdn

    PS: ton 2e lien est le même que le premier

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par vtk37 Voir le message
    PS: ton 2e lien est le même que le premier
    Corrigé, merci.

  5. #5
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    Salut,

    voila le code sous builder dont je voudrai reproduire le fonctionnement

    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
     
    void __fastcall TCPortChoiceFrm::FormCreate(TObject *Sender)
    {       // Prend liste des ports disponibles dans le Registre
        TRegistry * reg = new TRegistry();
        reg->RootKey = HKEY_LOCAL_MACHINE;
        bool res = reg->OpenKey("Hardware\\DeviceMap\\SerialComm",false);
        if(res) reg->GetValueNames(CBoxPort->Items); // Liste des ports
        if(CBoxPort->Items->Count)
        {      // Si nom des clés != COMx, lit valeurs
            if(CBoxPort->Items->Strings[0].SubString(1,3) != "COM")
                for(int i=0; i<CBoxPort->Items->Count; i++)
                    CBoxPort->Items->Strings[i] = reg->ReadString(CBoxPort->Items->Strings[i]);
        }
        delete reg;
                         // Affiche le port sélectionné :
        CBoxPort->ItemIndex = CBoxPort->Items->IndexOf(*PortName);
    }
    J'ai un peu commencé à bricoler un peu mais je tourne en rond je sais pas quoi mettre dans mon "if", il faudrait une fonction qui lit toute les clés se trouvant dans le répertoir Hardware\DeviceMap\SerialComm du regedit et mettre les données de chaque clés ensuite dans mon comboBox.
    Mais le soucis c'est que je ne sais pas comment recupérer la donné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    LONG Res=RegOpenKey(HKEY_LOCAL_MACHINE,"Hardware\\DeviceMap\\SerialComm",PHKEY phkResult);
    if (Res)
    {
     
    }
    RegCloseKey(HKEY_LOCAL_MACHINE);

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Regarde donc les Registry Functions... Notamment "RegQuery*" et "RegEnum*".

    Et surtout, ouvre ta propre base de registre et regarde ce qu'il y a dedans, à cette clé !! C'est de la programmation, pas du chamanisme, il n'y a rien à "deviner" !

    Démarrer -> Exécuter -> Regedit : la base non négociable quand on commence à tripoter la base de registre.

  7. #7
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    j'ai deja regardé dans la base de registre,

    les clés ont pour nom "\device\Serial0", "\device\Serial1"...
    et pour données "COM1", "COM2" ... et c'est sa que je voudrai récupérer car cette liste varie selon les PC

    doc si j'ai bien tout compris (j'ai encore un peu de mal avec l'aglais ) RegQueryValue me permettrai de récupérer les données et le type d'une clé
    et RegEnumValue me donne la liste des clés contenue dans le répertoire?

    Sinon j'ai trouvé cette exemple aussi:
    http://msdn.microsoft.com/fr-fr/library/df4afx57.aspx
    mais je comprend pas où il faut spécifier l'emplacement des clé à lire

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par vtk37 Voir le message
    j'ai deja regardé dans la base de registre,

    les clés ont pour nom "\device\Serial0", "\device\Serial1"...
    et pour données "COM1", "COM2" ... et c'est sa que je voudrai récupérer car cette liste varie selon les PC
    Ben donc, tu sais quoi lire et où...

    Citation Envoyé par vtk37 Voir le message
    Sinon j'ai trouvé cette exemple aussi:
    http://msdn.microsoft.com/fr-fr/library/df4afx57.aspx
    mais je comprend pas où il faut spécifier l'emplacement des clé à lire
    C'est du code .NET, pas touche.

    En Win32 natif, c'est RegOpenKey qui te dit quoi lire. La séquence d'utilisation, c'est :
    • RegOpenKeyEx
    • Ecriture : RegCreateKeyEx + RegSetValueEx
    • Lecture : RegQueryValueEx ou RegGetValue
    • Listage : RegEnumValue + RegEnumKeyEx
    • Fin : RegCloseKey

  9. #9
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    J'ai oublié de spécifié j'utilise visual studio 2008 donc je pense que je peux utilisé le .NET
    car avec RegOpenKey j'ai des erreur de symbole externe non résolu

    j'ai doc recommencer à utiliser mon ami google et j'ai trouvé sa
    http://www.developer.com/net/cplus/article.php/3449721

    j'ai donc commencé à faire un truc comme sa:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RegistryKey* PortKey;
     
      PortKey = Registry::LocalMachine->OpenSubKey("Hardware\\DeviceMap\\SerialComm");
      String* valueNames[] =PortKey->GetValueNames();
    Mais pour la derniére ligne j'ai comme message d'erreur:

    error C3699: '*' : impossible d'utiliser cette indirection sur le type 'System::String'

    idem pour la premiére ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C3699: '*' : impossible d'utiliser cette indirection sur le type 'Microsoft::Win32::RegistryKey'
    et 2 autre en rapport avec mon tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error C2728: 'System::String ^'*: un tableau natif ne peut pas contenir ce type managé 
    error C2440: 'initialisation' : impossible de convertir de'cli::array<Type,dimension>^ en 'System::String^[]'
    mais je pense que sa doit être un problème de C++/CLI...


    EDIT: j'ai resolu mes erreurs en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RegistryKey^ PortKey;
     
      PortKey = Registry::LocalMachine->OpenSubKey("Hardware\\DeviceMap\\SerialComm");
      array<String^>^ valueNames[] =PortKey->GetValueNames();
    j'ai jamais compris pourquoi des fois sa marche des fois non...

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par vtk37 Voir le message
    J'ai oublié de spécifié j'utilise visual studio 2008 donc je pense que je peux utilisé le .NET
    Non, car ton projet deviendrait alors un projet .NET, ce qui peut avoir des conséquences lourdes sur le reste de ton code.

    Citation Envoyé par vtk37 Voir le message
    car avec RegOpenKey j'ai des erreur de symbole externe non résolu
    L'aide MSDN de chaque fonction indique, dans le cartouche en bas, l'OS minimal pour l'utiliser, l'entête dans lequel la fonction est déclarée ainsi que la librairie à rajouter dans l'édition de liens.

    Citation Envoyé par vtk37 Voir le message
    j'ai jamais compris pourquoi des fois sa marche des fois non...
    Si tu ne comprends pas, c'est qu'en général tu fais n'importe quoi... Surtout en C/C++. Je te déconseille très vivement l'utilisation de code .NET pour juste énumérer des clés, regarde plutôt l'aide des fonctions que je t'ai linké au précédent message, et les exemples de code qui vont avec.

    Y'a rien de sorcier dans le fait d'aller pêcher des valeurs en base de registre, il serait bon pour toi de comprendre comment cela marche avant d'essayer de t'attaquer à "plus gros" en terme de complexité...

Discussions similaires

  1. [C] Lister les ports Série
    Par Shaina dans le forum C
    Réponses: 3
    Dernier message: 22/04/2010, 17h59
  2. Lister les ports Série disponible
    Par Mattetfamilly dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/01/2008, 18h07
  3. Réponses: 5
    Dernier message: 18/02/2005, 17h36
  4. Lister les ports disponibles
    Par belfaigore dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/02/2005, 17h58
  5. Lister les ports com disponible
    Par dyason dans le forum Général Python
    Réponses: 1
    Dernier message: 16/08/2004, 11h35

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