SillyBhum
Messages postés8Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention24 mai 2008
-
20 mai 2008 à 23:45
SillyBhum
Messages postés8Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention24 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!
A voir également:
Serie net
Visual basic serial port example - Meilleures réponses
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....
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 21 mai 2008 à 01:47
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)
SillyBhum
Messages postés8Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention24 mai 2008 21 mai 2008 à 02:45
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.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 21 mai 2008 à 02:59
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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
SillyBhum
Messages postés8Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention24 mai 2008 21 mai 2008 à 03:51
"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!
SillyBhum
Messages postés8Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention24 mai 2008 21 mai 2008 à 16:57
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
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...
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
SillyBhum
Messages postés8Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention24 mai 2008 21 mai 2008 à 18:34
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é.
SillyBhum
Messages postés8Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention24 mai 2008 22 mai 2008 à 23:16
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!!
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 23 mai 2008 à 21:56
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 #
SillyBhum
Messages postés8Date d'inscriptionlundi 14 avril 2008StatutMembreDernière intervention24 mai 2008 24 mai 2008 à 00:02
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!