Comment ouvrir un port série par nom convivial?
friendly name = le nom qui apparaît dans le "Gestionnaire de Périphériques" à la rubrique "Ports (COM & LPT).
EDIT: deux solutions fournies ci-dessous. Un avec WMI et un autre avec SetupAPI.
- Comme "COM1", "COM2", etc? Ou "Aten USB port Série (COM1)". Si l'ancien puis SerialPort1.Portname = "COM1", puis SerialPort1.ouvert
- Ce dernier, malheureusement
- WMI - deux requêtes en "root\CIMV2". 1) "SELECT * from Win32_SerialPort" ou 2) "SELECT * from Win32_PnPEntity OÙ ConfigManagerErrorCode = 0". Comme il a été suggéré d'utiliser WMICodeCreator pour plus de détails. Les requêtes les résultats doivent être analysés.
Vous devez vous connecter pour publier un commentaire.
Essayez d'exécuter une requête WMI sur le Win32_SerialPort classe. Télécharger WmiCodeCreator de l'expérience et de l'auto-générer le code C#.
Select * from Win32_SerialPort where Name = 'COM11'
n'a rien retourné. Le setupapi solution a fonctionné parfaitement, cependant. Aucune idée pourquoi WMI ne sait que sur COM1?Poster ce soir du code, pour le plaisir de tous:
uint
àIntPtr
(8bytes au lieu de 4 sur 64bits). Notez que c'est un pointeur, pas le ulong lui-même! Voir msdn.microsoft.com/en-us/library/windows/hardware/... de référence.Cet articlele code a fait le travail pour moi (il y a des liens de ce post, mais ne semble pas avoir apporté une réponse ici même). Voici l'auteur de code:
Utilisation:
Je sais que cela a été posté en C#, mais je suis certaine que cela peut facilement être converti...
Il trouve tous mes ports com, modem, série, usb et bluetooth.
Pavel classe
SetupDiWrap
fonctionne très bien, il a juste besoin de quelques petites modifications pour Windows 7.Nous espérons que cette mise à jour permettra d'aider d'autres personnes en difficulté (comme moi) pour obtenir des numéros de port COM à partir du PCV noms dans Windows 7.
1) Le
SP_DEVINFO_DATA
a changé dans Windows 7, la longueur totale est de plus de 28 octets, il est de 32 octets de long. C'est ce qui fonctionne pour moi:Note ulong Réservé, au lieu d'un int. Changer uint
cbSize
intcbSize
m'a sauvé d'une fonte plus tard, sinon vous pouvez le laisser tel uint.2) j'ai également écrit la ligne:
un peu différentes, pour plus de clarté, pour obtenir le cbSize 32 bits:
3) j'ai changé de
à
L'agent Recenseur n'est plus un
IntPtr
, de sorte que vous devez appelerSetupDiGetClassDevs
comme ceci:Note de "0" à la place de
IntPtr.Zero
lors du passage de l'agent Recenseur.Le code fonctionne maintenant comme un charme dans Windows 7!
Vous pourriez aussi envisager d'utiliser le registre que j'ai trouvé WMI assez lent (5 ou 6 secondes)
Dans mon cas, j'ai voulu identifier le port COM nom d'un périphérique avec un nom convivial. À l'aide de regedit, j'ai cherché dans le registre le nom convivial dans une clé qui contenait également le port COM. Parce que la clé que j'ai trouvé était une sorte d'ID aléatoire avec 10 autres personnes, je suis allé un peu les niveaux pour trouver une clé adaptée pour la recherche.
Le code, je suis venu avec est comme suit:
Bien sûr, ce besoin d'être modifié en fonction de comment et où votre appareil s'affiche dans la base de registre, mais si vous essayez de leur "Auto Detect" le Port Com d'un type spécifique de deivce alors vous devriez être en mesure de faire ce travail.
Rappelez-vous, si vous avez à recursivly de recherche, beaucoup de touches, puis cela va ralentir la solution ci-dessus vers le bas afin de l'essayer et de trouver le bon endroit dans le registre de regarder.
J'ai aussi inclus code WMI après le registre de la recherche dans le cas où la recherche du registre est venu vide:
Si vous êtes particulièrement à l'aide de périphériques USB et pas sur un autre type de port COM, la croix-plate-forme USB bibliothèque libusbp a un exemple vous pouvez exécuter qui montre comment trouver le port COM nom basé sur l'USB de l'ID de produit et l'ID du fournisseur du port COM.
Qui est différent, mais probablement le meilleur choix que d'essayer d'utiliser le nom convivial dans le Gestionnaire de Périphériques. Peut-être libusbp pourrait être étendu pour permettre l'accès à l'amicale nom si vous le voulez vraiment.
- Je utiliser les ports virtuels générés par com0com.
Avec qui vous êtes en mesure de nommer les ports que vous voulez - j'ai donc le port des légendes comme suit:
"com0com - bus for serial port pair emulator 0 (COMA <-> COMB)"
Ci-dessus posté code WMI, vous obtiendrez alors la nom
"COMA <-> COMB"
pour ce port.Il semble que de telles constructions sont pas de ports, mais le code ci-dessus va le traiter comme port série...
BTW,
"COMA"
est totalement un nom valide pour un port... (ce qui signifie, à la recherche de numéros à la fin n'est pas assez).Alors je me demande comment je peut distinguer de façon fiable entre un valide, de série existant nom du port et de ces étranges constructions...