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

MFC Discussion :

[API Win32] énumérer les ports série disponibles


Sujet :

MFC

  1. #1
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut [API Win32] énumérer les ports série disponibles
    Bonjour,
    est-ce que vous connaissez une fonction de l'API Win32 qui permet d'énumérer les ports com disponibles sur la machine ?
    on travaille avec des ports série sur USB qui se traduit par la création d'un port COM supplémentaire, mais ayant un index un peu fantaisiste : COM 5, voire COM 12 ! et j'ai pas envie d'en proposer 25 dans les options... Il me faudrait donc les énumérer, mais comment faire ?

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    si je me plante le plus simple est de regarder a cet endroit :
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serial\Enum

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 681
    Points
    10 681
    Billets dans le blog
    3
    Par défaut
    Voilà 6 manières de le faire:
    http://www.naughter.com/enumser.html

  4. #4
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    merci !
    mais, finalement, j'ai créé ma propre classe en utilisant CreateFile(), je pensais que ça allait être long, mais le constructeur s'exécute en moins de 20 ms sur ma machine avec GetTickCount(), donc en fait c'est transparent...
    cool... 8)
    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
     
    ComPortEnumerator::ComPortEnumerator(unsigned int StartIndex, unsigned int EndIndex)
    {
    	for (unsigned int i=StartIndex; i<EndIndex; i++)
    	{
    		if ( checkComPort(i) )
    			addComPort(i);
    	}
    }
     
    ComPortEnumerator::~ComPortEnumerator()
    {
    }
     
    /*! this function checks if a com port is available on the system */
    bool ComPortEnumerator::checkComPort(unsigned int ComPort)
    {
    	bool Res = false;
     
    	std::ostringstream OStrStream;
    	OStrStream << "\\\\.\\COM" << std::dec << ComPort;	
     
    	HANDLE HCom = CreateFile(	OStrStream.str().c_str(),
    										GENERIC_READ | GENERIC_WRITE,
    										0,
    										NULL,
    										OPEN_EXISTING,
    										FILE_FLAG_OVERLAPPED,
    										NULL ); 
       if ( HCom != INVALID_HANDLE_VALUE )
    	{
    		CloseHandle( HCom );
    		Res = true;
    	}
     
    	return Res;
    }
     
    /*! this function adds an available com port into the collection */
    void ComPortEnumerator::addComPort(unsigned int ComPort)
    {
    	std::ostringstream OStrStream;
    	OStrStream << "COM " << std::dec << ComPort;
    	m_VectStrComPort.push_back( OStrStream.str() );
    }
     
     
    /*! returns the string representation of a com port */
    const std::string& ComPortEnumerator::getStrComPort( unsigned int Index )
    {
    	m_StrBuf = "";
    	if ( Index < m_VectStrComPort.size() )
    		m_StrBuf = m_VectStrComPort[Index];
    	return m_StrBuf;
    }

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    tu devrais modifier un peu ton code a l"image du lien proposé par aurelien:
    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
     
    //Up to 255 COM ports are supported so we iterate through all of them seeing
      //if we can open them or if we fail to open them, get an access denied or general error error.
      //Both of these cases indicate that there is a COM port at that number. 
      for (UINT i=1; i<256; i++)
      {
        //Form the Raw device name
        CString sPort;
        sPort.Format(_T("\\\\.\\COM%d"), i);
     
        //Try to open the port
        BOOL bSuccess = FALSE;
        HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
        if (hPort == INVALID_HANDLE_VALUE)
        {
          DWORD dwError = GetLastError();
     
          //Check to see if the error was because some other app had the port open or a general failure
          if (dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE || dwError == ERROR_SHARING_VIOLATION)
            bSuccess = TRUE;
        }
        else
        {
          //The port was opened successfully
          bSuccess = TRUE;
     
          //Don't forget to close the port, since we are going to do nothing with it anyway
          CloseHandle(hPort);
        }

  6. #6
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    le but de ma classe est de lister les ports com disponibles en lecture/écriture à un instant donné. Un port déja utilisé par une autre appli est considéré non disponible, donc non listé par ma classe : c'est ce que je veux.

+ 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écupérer la liste des ports Série disponibles
    Par marcootz dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/11/2007, 19h00
  4. Utiliser les ports série avec Wine sous linux
    Par JP.NUAGE dans le forum Matériel
    Réponses: 1
    Dernier message: 21/10/2007, 13h12
  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