Détection des ports série [Résolu]

Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
- - Dernière réponse : SillyBhum
Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
- 24 mai 2008 à 00:02
Salut!

Je viens de finir un programme utilisant le port série pour communiquer avec un système embarqué. Aujourd'hui j'ai testé ce programme sur un pc qui n'avait pas de port série ce qui plante le programme lorsqu'il  cherche à ouvrir le port série...
Je voudrais donc effectuer un test avant l'ouverture du port série permettant de detecter la présence ou non de port série sur le PC.

En partant de ce que j'ai trouvé dans ma base de registre et de différents topics,
j'ai fait ca :

__________________________________________________________________
Dim detect As String = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM", "\Device\Serial2", "")                         'on lit la valeur de la clé concernant le port série.
        If detect Nothing Then                     'si la valeur nothing c'est que la clé et donc le port n'existe pas

            MessageBox.Show("This software needs a serial port to communicate with the CPI.", "ERROR!", MessageBoxButtons.OK, MessageBoxIcon.Error)

            Me.Close()
        End If
___________________________________________________________________

Ce qui ne fonctionne pas...

En cherchant dans le forum, j'ai découvert les WMI mais  j'ai pas trouvé d'info sur les ports séries.

Quelqu'un aurait il une idée sur comment faire? ou une correction a apporter à mon test?

Merci!
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
3
Merci
Allo!

C'est bon, j'ai tout refait et j'arrive à détecter et lister mes sérial ports. Voici le code ok :

   Dim detect As String()

        detect = System.IO.Ports.SerialPort.GetPortNames()

        If detect is Nothing Then
            MessageBox.Show("This software needs a serial port to communicate with the CPI.", "ERROR!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Me.Close()
        End If

Ceci dit, je ne peux pas faire ce que je veux, je m'explique :
 voici la liste de mes sérials ports sur mon portable :

avegeremodem   =>COM3

Le problème c'est que je n'ai pas de serial port. Mon programme ne rentre pas dans le "if" à cause du COM3 mais plante quand même vu que je n'ai pas de serial port...
 J'ai testé sur d'autre PC n'ayant pas de serial port, ils ont aussi un ou plusieurs COM# correspondant à je ne sais pas quoi (modem...).
 Donc mon test  "if detect is nothing" ne sert à rien et je ne peux pas faire une liste des COM# à tester puisqu'il varient en fonction du PC....

tant pis! Merci pour l'aide.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de SillyBhum
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Salut
En fait, tu as fixé en dur dans ton programme le nom de l'interface qui te servira : Serial2.
Donc, normal qu'un PC qui n'aura pas ce port réponde mal.
La clé de registre est bonne, mais il faut énumérer les items se trouvant après HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
En .Net, il doit y avoir des classes toutes faites, mais je ne connais pas assez.
Une fois que tu en auras la liste, il te suffira de les mettre dans une ComboBox pour que l'utilisateur choisisse la bonne et que tu utiliseras comme paramètre dans ton programme.

Tiens, je t'ai pondu un exemple :
        Dim monReg As Microsoft.Win32.RegistryKey
        Dim xx As String()
        Dim r As Short
        monReg = My.Computer.Registry.LocalMachine.OpenSubKey("HARDWARE\DEVICEMAP\SERIALCOMM", False)
        xx = monReg.GetValueNames
        For r = LBound(xx) To UBound(xx)
            Debug.Print(xx(r))
        Next

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
0
Merci
Merci pour la réponse si rapide!
Il y a deux trois choses que je n'avais pas spécifiées, je m'en excuse :

=> "En fait, tu as fixé en dur dans ton programme le nom de l'interface qui te servira : Serial2."

Oui, désolé de ne pas l'avoir spécifié,j'ai fait exprès, pour pouvoir tester sur mon PC si la fonction utilisée est bonne. Pour ensuite passer à  l'ensemble des noms à tester.
Mais je pense que ce qui n'est pas reconnu est  la facon dont j'ai écrit "\device\serial2"...

=>"Une fois que tu en auras la liste, il te suffira de les mettre dans une
ComboBox pour que l'utilisateur choisisse la bonne et que tu
utiliseras comme paramètre dans ton programme."

La liste des objets contenus dans la clé HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM ne comprend pas seulement les ports séries, j'ai par exemple dans le mien "\Device\ageremodem" qui n'est pas du tout un port série!
Je ne peut donc pas me contenter de vérifier si SERIALCOMM n'est pas vide, il faut vraiment que je vérifie qu'il y a un \device\serial#
Ensuite, mon programme comprend déja une fonction permettant à l'utilisateur de choisir le port comm à utiliser. Je souhaite justement vérifier qu'il existe un port comm avant de proposer à l'utilisateur d'entrer le numéro du port qu'il veut utiliser.

>" xx monReg.GetValueNames"
Je n'ai pas  .Getvaluenames de disponible, j'ai essayé ceci avant de poster ce message. Je ne sais pas pourquoi. J'utilise VB2005 express...

Je vais ré-essayer deux trois bidouilles demain en partant de ton exemple.

merci encore!

 
Commenter la réponse de SillyBhum
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
J'ai fait l'essai avec VS 2008.
Je ne connais pas trop .Net
Peut-être est-ce le niveau de Framework : J'ai installé 1.1, 2.0 +SP1, 3.0 + SP1 et 3.5 (la totale)

Oui, il faut approfondir :
- Détecter si le texte correspond au masque device\serial# : une histoire de String, facile
  Ou bien plutôt le contenu de cette Value : COMx
- Vérifier que le port est actif, car même si un port série est affiché ici, il se peut qu'il ne soit pas utilisable.
Je n'ai pas fait le test, mais certaines connexions USB s'assimilent à des ports série, donc si l'appareil USB correspond n'est pas connecté, le port reste (peut-être) déclaré, mais n'est pas fonctionnel

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
0
Merci
"Je
n'ai pas fait le test, mais certaines connexions USB s'assimilent à des
ports série, donc si l'appareil USB correspond n'est pas connecté, le
port reste (peut-être) déclaré, mais n'est pas fonctionnel"

=> mon port comm fonctionne très bien puisque je l'utilise dans mon programme pour communiquer, pas de problème de ce côté là!

Je m'y colle demain pas de pb, jvais trouver comment faire! lentement mais surement!
Commenter la réponse de SillyBhum
Messages postés
14322
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
14 décembre 2018
0
Merci
Bonjour

En .NET 2+, My.Computer.Ports.*

Voilà, pour la liste (pas ouvert l'EDI, donc je ne me rappel plus précisément où c'est.

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Commenter la réponse de NHenry
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
Ne serait-ce pas plutot System.IO.Ports.SerialPort

Et la liste des ports dispo : System.IO.Ports.SerialPort.GetPortNames

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Commenter la réponse de cs_casy
Messages postés
14322
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
14 décembre 2018
0
Merci
Bonjour

Oui, c'est aussi accessible par ce chemin là.

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Commenter la réponse de NHenry
Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
0
Merci
ok, une fois de plus merci pour ces réponses.
Qui d'ailleurs semblent répondre à mes attentes mais j'ai dut faire une connerie! et oui, c'est comme ça qu'on apprend il paraît.
enfin, voila ce que j'ai fait :
________________________________________________________________________________
        Dim detect As Array

        detect = System.IO.Ports.SerialPort.GetPortNames()

        If detect Is Nothing Then
            MessageBox.Show("This software needs a serial port to communicate with the CPI.", "ERROR!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Me.Close()
        End If
_______________________________________________________________________________

 Statr debbuging et hop 2 erreurs :

Error    3    The "ResolveComReference" task could not be instantiated from the assembly "Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Could not load file or assembly 'Microsoft.Build.Utilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. Le chemin d'accès spécifié est introuvable.
   

Error    4    The "ResolveComReference" task has been declared or used incorrectly, or failed during construction. Check the spelling of the task name and the assembly name. 
 

Ces erreurs apparaissent maintenant dans visual basic 2005 express quel que soit le programme sur le quel je travaille...
Commenter la réponse de SillyBhum
Messages postés
14322
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
14 décembre 2018
0
Merci
Bonjour

Sur le pb, aucune idée, mais pour ton code :

        Dim detect As string()

        detect = System.IO.Ports.SerialPort.GetPortNames()

        If detect.Length=0 Then
           
MessageBox.Show("This software needs a serial port to communicate with
the CPI.", "ERROR!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Me.Close()
        End If

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Commenter la réponse de NHenry
Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
0
Merci
merci, mais je peux pas vérifier si ca marche pour le moment.

Je ne comprend pas, l'erreur dit

Could not load file or assembly 'Microsoft.Build.Utilities,

je viens de vérifier, cette *.dll est pourtant bien présente à l'endroit attendu.
J'ai désinstallé et réinstallé Visual studio ainsi que les frameworks, rien n'y fait.

Si quelqu'un a une idée, je suis preneur!

En tout cas, merci pour le code, je viendrais valider une fois testé.
Commenter la réponse de SillyBhum
Messages postés
14322
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
14 décembre 2018
0
Merci
Bonjour

Je n'ai jamais eu cette erreur, et je t'aurais conseiller de réinstaller le Framwork SDK correspondant à la version de ton EDI.

Dsl.

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Commenter la réponse de NHenry
Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
0
Merci
cool, j'ai réussi à régler le problème.

Désinstallation et réinstallation de tout (framework et visual studio) avec un coup de Ccleaner et de défragmentation entre les deux...

mais j'ai perdu des données dans la bataille. Mes derniers ajouts de code on été virés malgré les sauvegardes... Donc, je refais ce qui manque et je reviens à la partie détection du port série!!

++
Commenter la réponse de SillyBhum
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
Ton COM3 correspond à un modem. Tous les portables on généralement un modem d'installé (il est inclu sur la carte mère). Ce modem est vu par le system à travers un port série et en règle générale le COM3.

Une grande majorité de PC de bureau possède un port série physique, généralement le COM1. Sur ces PC peuvent apparaitre aussi d'autres ports, le COM3 comme sur les portables s'il y a un modem, mais aussi parfois le COM2 dans le cas ou la carte mère possède une entrée pour un périphérique IRDA et que cette entrée est activée au niveau du bios, même si aucun périphérique IRDA n'est installé.

Enfin, certains moyens de communications modernes, notamment Bluetooth se font à travers un port série classique (à partir de 3 et pouvant aller au delà de 20).

Faire une liste des ports disponibles n'est certes pas suffisant. Mais la filtrer est délicat, tu prends le risque de zapper le port réellement utiliser dans certaines configurations.

Tu as la possibilité de fournir cette liste à l'utilisateur, qui devras choisir le bon port.

Ou sinon, si ton équipement le permet, tu peux l'interroger avec une commande d'identification pour voir s'il est présent. Tu passe en revue chacun des ports de ta liste et t'interroge. Lorsque ton équipement répond, c'est que tu as trouvé le bon port.

Par exemple, pour un modem, tu ouvrirais le port, tu enverrais les caractères "AT" et retour charriot. Si un modem était branché, il te répondrait "OK".

Un autre exemple que l'on avait mis en place sur un équipement que l'on fabriquait dans mon ancienne boite. On positionnait certains signaux de controles du port dans une combinaison qui n'est habituellement pas rencontrée. L'équipement en retour répondait en positionnant d'autres signaux de controles dans une combinaison non habituelle aussi. Les 2 combinaisons nous permettais d'identifier de façon sûre et autoatique le branchement de l'équipement en passant en revue tous les ports disponibles.
Je ne peux te donner plus de détails, c'est en exploitation dans le monde entiers dans l'aéronautique, donc secrets de fabrications, etc ...

 
---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Commenter la réponse de cs_casy
Messages postés
8
Date d'inscription
lundi 14 avril 2008
Dernière intervention
24 mai 2008
0
Merci
ok, dans ce cas, peut être que ce serait plus simple en reprenant mon idée de base, c'est à dire en passant par la base de registre puisque dans la base, il est spécifié serialport ou encore avegeremodem...
Je vais faire encore quelque tests mais , je ne souhaite pas perdre trop de temps la dessus, j'ai d'autres priorités!
Commenter la réponse de SillyBhum

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.