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 :

Lister les ports disponibles [Sources]


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Points : 61
    Points
    61
    Par défaut Lister les ports disponibles
    Bonjour

    Je souhaiterai lister les ports COM disponible d'un PC mais je n'est aucune idée de comment on fait, quelqu'un pourrai t'il m'aider ???

    Sinon peut-etre est-ce possible de lancer directement la configuration d'une liaison port (comme dans windows) ?

  2. #2
    Membre averti Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut Re: Lister les ports disponibles
    Citation Envoyé par belfaigore
    Bonjour

    Je souhaiterai lister les ports COM disponible d'un PC mais je n'est aucune idée de comment on fait, quelqu'un pourrai t'il m'aider ???

    Sinon peut-etre est-ce possible de lancer directement la configuration d'une liaison port (comme dans windows) ?
    je suppose qu'il faut jeter un coup d'oeil du coté des socket .... je ne suis pas sur je n'y connais rien ...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    Ben j'ai regardé du niveau des socket mais il y a une notion de port mais ce sont les 65535 port (style internet), je n'ai rien trouvé concernant le Port Série.

    Cependant, il semble y avoir des methode indépendament d'une classe), qui permettent de parametrer le port, du genre :

    • SetCommTimeouts
      GetCommState
      SetCommState
      PurgeComm
      EscapeCommFunction


    Donc je pense qu'il doit y avoir dans le même genre une methode me permettant de recuperer la liste des port série.

  4. #4
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    les sockets concernent les ports TCP/IP et UDP qui sont des protocoles de communications réseaux pour l'échange d'informations. Donc ca n'a rien à voir avec les ports séries ou le ports COM, qui sont des composants physiques.

    Effectivement les API que t'as cités te permettent de jouer sur les paramètres d'un port, mais ne permettent pas d'afficher la fenêtre de configuration d'un port COM (comme sous HyperTerminal).

    Il y a aussi la fonction CreateFile qui te permet d'ouvrir un port COM. Je t'aurais conseillé de l'utiliser pour lister les ports COM qui se trouvent sur ta machine, mais je ne sais pas comment elle réagit si le port est déjà ouvert par une autre application. Tu peux quand même faire le test.

    Pour infos, voici comment faire pour ouvrir un port COM:
    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
     
    HANDLE hd = NULL;
      hd = CreateFile("COM4",
                      GENERIC_READ | GENERIC_WRITE,
                      0,
                      NULL,
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      NULL);
      if(hd != INVALID_HANDLE_VALUE)
      {
        ShowMessage("Port COM ouvert avec succès");
      }
      else
      {
        ShowMessage("Problème");
      }
    Pour le moment j'ai pas d'autres informations, mais j'hésiterais à poster dès que j'en aurais d'autres ;-).

    Bon courage
    "Don't think you are, know you are..." (Morpheus)

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Utilise le composant ComPort. Facile à installer et à utiliser. On peut tout faire rapidement et simplement.

  6. #6
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par gandf
    Utilise le composant ComPort. Facile à installer et à utiliser. On peut tout faire rapidement et simplement.
    Je suis d'accord si c'est pour manipuler un port COM bien précis. Mais par contre comment tu veux t'en servir si tu veux lister les ports COM qui sont présents sur une machine ?
    "Don't think you are, know you are..." (Morpheus)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    Merci beaucoup pour c precision Neo41, j'ai trouver un site qui explique tout sur les port COM.

    Cela je comprend bien les methode pour lister les port COM disponible ( je teste pour chaque port si la communication est possible) seulement sa implique qu'il faut que je definisse la liste des COM a tester, c'est a dire, que si je teste pour le COM1 et le COM2 seulement, et que l'ordinateur dispose d'un COM3, je ne l'afficherai pas.

  8. #8
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par belfaigore
    Cela je comprend bien les methode pour lister les port COM disponible ( je teste pour chaque port si la communication est possible) seulement sa implique qu'il faut que je definisse la liste des COM a tester, c'est a dire, que si je teste pour le COM1 et le COM2 seulement, et que l'ordinateur dispose d'un COM3, je ne l'afficherai pas.
    Tout à fait. Ceci dit je ne pense pas que ce soit la meilleure solution pour récupérer la liste des ports com présents sur ta machine. En fait le CreateFile renvoie INVALID_HANDLE_VALUE si le port est déjà ouvert par une autre application.

    Donc si tu testes les ports COM1, COM2 et COM3, alors que le COM1 est déjà ouvert (par HyperTerminal par exemple), ton application va te renvoyer que seuls les ports COM2 et COM3 existent, ce qui est faux.

    Il existe surement d'autres moyens. Je vais essayer de trouver, et si quelqu'un connait une solution qu'il n'hésite pas à poster ;-)
    "Don't think you are, know you are..." (Morpheus)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    bon alors voila j'ai trouver une piste, la liste des COM disponible se trouve dans la base de registre de Windows, a savoir :
    HKEY_LOCAL_MACHINE / HARDWARE / DEVICE MAP / SERIAL PORT
    maintenant se qu'il faudrai ce serai etre capable de recupérer toutes les clé qui se trouve dans cette session pour y extraire les noms des ports.

  10. #10
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Hello !

    Pour extraire les noms des clés, et tout le reste, je te conseille vivement la FAQ

    Sinon, sans vouloir t'alarmer, sur mon poste, la liste est ici :
    HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

    Où as-tu trouvé cette info ?

    Cordialement,

    Arnaud

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    Voici le code que j'utilises dans un assistant d'install:
    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
     
    void __fastcall TAssistant::FindSerial()
    {
            int n;
            AnsiString NOCOM;
            HANDLE hComm;
            for (n=1;n<=255;n++){
                    NOCOM="\\\\.\\COM"+AnsiString(n);
     
     
     
     
                    hComm = CreateFile(NOCOM.c_str() ,
                                                GENERIC_READ | GENERIC_WRITE,
                                                0,
                                                0,
                                                OPEN_EXISTING,
                                                0,
                                                0);
     
     
                    if(hComm != INVALID_HANDLE_VALUE){
                            NoCom->AddItem("COM"+AnsiString(n),0); //NoCom est une ComboBox
                    }
                    CloseHandle(hComm);
     
            }
    }
    Je limite à 255 car Windows ne peut gérer que 255 ports

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    Je suis tout à fait d'accord avec toi mais le probleme c'est que si le port est déjà utiliser par une autre application, tu ne l'affichera pas.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    D'accord, mais d'après la question de départ, il était question de ne lister que les ports disponibles, donc....

  14. #14
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    Pour ce que est de la base des registres, utilitse la méthode ReadSectionValues de TRegistryIniFile, cela devrait te permettre de lister tous les ports

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    je te remercie mais j'ai un probleme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRegistryIniFile *Reg = new TRegistryIniFile;
    me donne une erreur :
    Impossible de trouver une correpondance pour 'TRegistryIniFile::TRegistryIniFile()'
    et j'ai bien inclula librairi <Regitry.hpp>

  16. #16
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    essaie plutôt d'inclure "registry.h"

  17. #17
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Citation Envoyé par sebgui
    essaie plutôt d'inclure "registry.h"
    Et surtout de lire la FAQ, qui contient tout ce qu'il faut !
    http://c.developpez.com/faq/bcb/

    (ce lien t'a été signalé un certain nombre de fois belfaigore... Essaye de préter un minimum d'attention à ceux qui te répondent...)

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 135
    Points : 61
    Points
    61
    Par défaut
    Sa y est sa marche, je donne le code pour ceux qui sont intéressé :
    PS : CF_COM = mon ComboBox qui continet les noms des ports COM

    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
      TRegistry *registre = new TRegistry();
      TStringList *ListCles = new TStringList();
     
      // la clé racine par défaut est HKEY_CURRENT_USER
      registre->RootKey = HKEY_LOCAL_MACHINE;
      registre->OpenKeyReadOnly("HARDWARE\\DEVICEMAP\\SERIALCOMM"); // clé courante
      registre->GetValueNames(ListCles);
     
      if (ModeTest)
      {
        ShowMessage("BASE DE REGISTRE"sLineBreak
                    "----------------------------------"sLineBreak
                    "PATH=HKEY_LOCAL_MACHINE\\" + registre->CurrentPath + sLineBreak
                    "Port trouvé(s) ="+ListCles->Count);
      }
     
      CF_COM->Items->Clear();
      if (ListCles->Count)
      {
        for (int i=0;i<ListCles->Count;i++)
        {
          CF_COM->Items->Add(registre->ReadString(ListCles->operator [](i)));
        }
      }
      else
      {
        CF_COM->Items->Add("pas de port disponible");
      }
     
      delete registre;
      delete ListCles;

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

Discussions similaires

  1. Lister les ports série disponibles
    Par vtk37 dans le forum Débuter
    Réponses: 9
    Dernier message: 27/07/2009, 14h35
  2. Lister les ports Série disponible
    Par Mattetfamilly dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/01/2008, 17h07
  3. Réponses: 1
    Dernier message: 13/10/2006, 10h32
  4. [C#] Lister les serveurs disponibles dans le réseau
    Par fafa139 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 10/04/2006, 18h09
  5. Lister les ports com disponible
    Par dyason dans le forum Général Python
    Réponses: 1
    Dernier message: 16/08/2004, 10h35

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