Selection automatique d'un port série

Signaler
Messages postés
6
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
7 mai 2010
-
Messages postés
6
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
7 mai 2010
-
bonjour,

je suis stagiaire dans un bureau d'étude et je dois faire des modifications / améliorations d'un programme déjà existant. Je n'ai pas vraiment une formation de développement logiciel mais seulement quelques légères bases générales en programmation. Le programme récupère des informations d'un système qui envoie des données par un câble série, branché au pc par un adaptateur série/usb (c'est un portable, je n'ai pas de port série dessus).

Mon problème est que le port COM correspondant a la facheuse tendance à changer, une fois c'est 1 puis 4 ou 5.
Actuellement le port COM à utiliser est écrit quelque part dans le code et je dois le changer manuellement quand le port COM a changé. Il n'est pas envisageable que l'utilisateur futur du logiciel ait à aller "trifouiller" dans le code pour que le bon port COM soit utilisé.

Ce qui m'amène à ma question : j'imagine qu'il est possible logiciellement de sélectionner le port COM adéquat, comment puis-je faire ça ?
(je travail en C avec devC++)

Merci pour vos réponses

Flo

6 réponses

Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
la solution la plus facile est d'avoir un fichier de config (ini) avec le numéro du port COM.
Résultat, trifouillé un fichier de conf pas le code.

Pour la détection automatique, bah euh ...
Tu ouvres le port, pour tu balances une donnée (jene sais pas laquelle) à ton équipement, si ca répond c'est que c'est le bon port. sinon tu passes au suivant et ainsi de suite.
Messages postés
6
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
7 mai 2010

Merci pour la réponse.

dans le cadre de l'application il serait préférable que l'utilisateur n'est aucune manipe à faire, même si regarder quel port COM est utilisé puis l'inscrire dans un fichier config n'est pas très compliqué.

Mon équipement est un anémomètre + girouette qui envoie des trames NMEA avec les infos directions et vitesse du vent. Je n'ai aucune idée si il va réagir à l'envoie de quelque chose, je vais me renseigner.
Messages postés
9
Date d'inscription
vendredi 2 avril 2010
Statut
Membre
Dernière intervention
7 avril 2010

Hello,

Serait-il possible de savoir ton système d'exploitation ?

Je dispose d'une solution sous windows si tu le désires.
Sous linux on peut envisager une solution aussi...

HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\5\SerialController\

+

http://www.ghostsinthestack.org/article-3-manipulation-de-la-base-de-registre-windows.html

En deux mots tu scan ta base de registre pour savoir les ports disponible...

J'espère que ca peut t'aider... Bon courage a toi
Messages postés
6
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
7 mai 2010

Je suis sous windows vista.

Si j'ai bien compris en lisant la valeur du registre, on peut savoir quels sont les ports utilisés ? De cette manière on n'a pas la possibilité d'identifier qu'est-ce qui est branché au port ?
Messages postés
9
Date d'inscription
vendredi 2 avril 2010
Statut
Membre
Dernière intervention
7 avril 2010

le port série ne permet pas de savoir ce qui est branché derrière sauf si tu utilises un protocole spécifique de communication. Et ainsi de pouvoir identifier sur quel port il est utilisé.

En fait le reste du travail reste a être codé...

Tu tests les ports qui sont présent dans la base de registre et ensuite tu essais de communiquer et si ca marche pas passe au suivant... Détection automatique.

Bon courage
Messages postés
6
Date d'inscription
mercredi 31 mars 2010
Statut
Membre
Dernière intervention
7 mai 2010

Moi j'ai pas SerialController dans HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\5\ quand je vais voir dans regedit.

Finalement je n'utilise pas la base de registre, je passe en revue tout les COM de 0 à 9 (je sais pas si c'est possible d'avoir un COM0 ?) en supposant que sur un pc on aura en général pas de COM supérieur à 9. Chez moi les COM disponible en ouvrant hyperterminal sont le 2, 3 et 5, j'ai abandonné d'essayer de comprendre...
J'ai modifié un code d'exemple de communication série trouvé sur le site (http://www.cppfrance.com/code.aspx?id=22441).
Puis je prends un échantillon de la chaine reçue et je cherche si elle contient une suite de caractère envoyé par le périphérique visé.

Voila le code (une partie) :
int detectionCOM()
{
    /* variables locales */
    char buffer[64];
    int nId, nChoice, nBytesWritten, nBytesRead;

    // boucle de scan des différents port COM //
    for (nId = 0; nId < 10; nId++)
        {
             // tentative d'ouverture //
             printf("Ouverture et configuration du port COM%d...\r\n", nId);
             if(OpenCOM(nId))
                 {
                     printf("...OK\r\n");
             
                     // recevoir des données //
                     printf("\r\n");
                     printf("Reception de donnees...\r\n");
                     if(ReadCOM(buffer, sizeof(buffer)-1, &nBytesRead))
                     {
                        buffer[nBytesRead] = '\0';
                        printf("%d octet(s) recu(s) :\r\n%s\r\n", nBytesRead, buffer);
                        if (strstr(buffer,"$IIVWR")!= NULL) 
                            {
                                       if (nId 0) COM "COM0:";
                                       else if (nId 1) COM "COM1:";
                                       else if (nId 2) COM "COM2:";
                                       else if (nId 3) COM "COM3:";
                                       else if (nId 4) COM "COM4:";
                                       else if (nId 5) COM "COM5:";
                                       else if (nId 6) COM "COM6:";
                                       else if (nId 7) COM "COM7:";
                                       else if (nId 8) COM "COM8:";
                                       else if (nId 9) COM "COM9:";
                                   printf("COM retenu : COM%d\r\n", nId);
                                   CloseCOM();
                                   break;
                            }
                     }
                     else
                        printf("Erreur lors de la reception.\r\n");
                 }
             CloseCOM();
        }
        if (COM NULL) COM "COM1:";
}


Ça marche, mais je voudrais savoir si vous y voyez des incohérences ou des inepties vu que moi et la programmation c'est pas trop ça...