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 :

Comment analyser quel port série est utilisé ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 analyser quel port série est utilisé ?
    Bonjour à tous,

    j'utilise la fonction "createfile()" pour ouvrir une communication série, mais je sais déjà que le matériel est branché sur le "COM5" et je voudrai que le programme détecte sur quel port série je branche le matériel car si je le branche sur "COM2" je serai obligé de changer le code.

    Voilà ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hdl=CreateFile("COM5",GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    J'espère m'être exprimé correctement !!!

    Merci d'avance pour vos réponses, à bientôt !

  2. #2
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Ce que je ferais, c'est détecter tout les numéros de ports COM existant à coup de createfile(). Puis tu proposerais à l'utilisateur quel COM il désire utiliser. Sinon tu peux toujours tâcher d'automatiser, tout dépend de ton réel besoin.

    Autrefois (dans un passé lointain d'au moins un an), j'avais utiliser la fonction suivante pour lister les ports COM existant. Par contre c'est en C++, donc à toi d'adapter ton code pour les quelques modifications:
    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
    /***************************************************************************************
    * TestPortExistant: Retourne les numéros des ports COM existant
    *
    *       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.
    *       Both of these cases indicate that there is a COM port at that number. 
    *       
    * 19/02/2007                                               
    ***************************************************************************************/ 
    bool CXXX::TestPortExistant(unsigned int *iPorts)
    {
            unsigned int cpt = 0;
    	bool bRet = false;
     
    	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
    		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){
    				iPorts[cpt++] = i;
    				bRet = true;
    			}
    		}
    		else
    		{
    			//The port was opened successfully
    			iPorts[cpt++] = i;
    			bRet = true;
     
    			//Don't forget to close the port, since we are going to do nothing with it anyway
    			CloseHandle(hPort);
    		}
    	}
     
    	return bRet;
    }

  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
    Ce que je voudrai, c'est que l'application détecte automatiquement le port auquel le matériel est raccordé.

    Je ne comprend pas trop ton code !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sPort.Format(_T("\\\\.\\COM%d"), i);
    Surtout cette ligne !!!

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ce code C++ utilise la bibliothèque (payante) Microsoft Foundation Classes.

    La fonction CString::Format() fait l'équivalent d'un sprintf() sur la CString.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Ton matériel lève-t-il un des signaux (DSR?) Il faut qu'un des signaux soit lever pour que tu sache qu'il est connecté. A ce moment, tu reprend la boucle de homeostasie et tu teste ton signal.

  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
    OK, je vais faire comme ça alors, je vous tiens au courant !

    Juste une question, sur une autre application (visuelle en c++), je voudrai faire un délai d'attente à un moment et j'ai essayé Sleep(), et delay() mais ça veut pas compiler !!!!

    Comment puis-je faire ???


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

Discussions similaires

  1. [VB.NET] Comment supprimer un fichier qui est utilisé ?
    Par Toon94 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/06/2010, 12h59
  2. Comment utiliser le port série avec WxWidget
    Par LOMA.fr dans le forum wxWidgets
    Réponses: 1
    Dernier message: 28/10/2007, 16h45
  3. [PHP-JS] Comment savoir quel champ n'est pas rempli ?
    Par illight dans le forum Langage
    Réponses: 8
    Dernier message: 28/03/2007, 15h03
  4. Comment interroger le port série en PHP ?
    Par thenightmare1985 dans le forum Langage
    Réponses: 3
    Dernier message: 13/12/2006, 00h41
  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