J'ai du code qui charge les ports série dans une combo-box:
List<String> tList = new List<String>();
comboBoxComPort.Items.Clear();
foreach (string s in SerialPort.GetPortNames())
{
tList.Add(s);
}
tList.Sort();
comboBoxComPort.Items.Add("Select COM port...");
comboBoxComPort.Items.AddRange(tList.ToArray());
comboBoxComPort.SelectedIndex = 0;
Je voudrais ajouter les descriptions de port (similaires à celles qui sont affichées pour les ports COM dans le Gestionnaire de périphériques) à la liste et trier les éléments de la liste qui se trouvent après l'index 0 (résolu: voir l'extrait ci-dessus). Quelqu'un a-t-il des suggestions pour ajouter les descriptions de port? J'utilise Microsoft Visual C # 2008 Express Edition (.NET 2.0). Toutes les pensées que vous pourriez avoir seraient appréciées. Merci.
Il y a un publication sur ce même problème sur MSDN :
Obtenir plus d'informations sur un port série en C #
Salut Ravenb,
Nous ne pouvons pas obtenir les informations via le type SerialPort. Je ne sais pas pourquoi vous avez besoin de ces informations dans votre candidature. Cependant, il y a un thread résol avec la même question que vous. Vous pouvez y consulter le code et voir s'il peut vous aider.
Si vous avez d'autres problèmes, n'hésitez pas à me le faire savoir.
Cordialement, Bruce Zhou
Le lien dans ce post va à celui-ci:
Comment obtenir plus d'informations sur le port à l'aide de System.IO.Ports.SerialPort
Vous pouvez probablement obtenir ces informations à partir d'une requête WMI. Découvrez cet outil pour vous aider à trouver le bon code. Pourquoi voudriez-vous cependant? Ce n'est qu'un détail pour un émulateur USB, les ports série normaux n'en auront pas. Un port série est simplement connu par "COMx", rien de plus.
MODIFIER: Désolé, j'ai passé votre question trop rapidement. Je me rends compte maintenant que vous cherchez une liste avec le nom du port + la description du port. J'ai mis à jour le code en conséquence ...
À l'aide de System.Management, vous pouvez interroger tous les ports et toutes les informations pour chaque port (tout comme le Gestionnaire de périphériques ...)
Exemple de code (assurez-vous d'ajouter une référence à System.Management):
using System;
using System.Management;
using System.Collections.Generic;
using System.Linq;
using System.IO.Ports;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
using (var searcher = new ManagementObjectSearcher
("SELECT * FROM WIN32_SerialPort"))
{
string[] portnames = SerialPort.GetPortNames();
var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();
var tList = (from n in portnames
join p in ports on n equals p["DeviceID"].ToString()
select n + " - " + p["Caption"]).ToList();
tList.ForEach(Console.WriteLine);
}
// pause program execution to review results...
Console.WriteLine("Press enter to exit");
Console.ReadLine();
}
}
}
Plus d'informations ici: http://msdn.Microsoft.com/en-us/library/aa394582%28VS.85%29.aspx
Utiliser l'extrait de code suivant
Il donne la sortie suivante lors de son exécution.
serial port : Communications Port (COM1)
serial port : Communications Port (COM2)
N'oubliez pas d'ajouter
using System;
using System.Management;
using System.Windows.Forms;
Ajoutez également une référence à system.Management
(par défaut, il n'est pas disponible)
C #
private void GetSerialPort()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_PnPEntity");
foreach (ManagementObject queryObj in searcher.Get())
{
if (queryObj["Caption"].ToString().Contains("(COM"))
{
Console.WriteLine("serial port : {0}", queryObj["Caption"]);
}
}
}
catch (ManagementException e)
{
MessageBox.Show( e.Message);
}
}
VB
Private Sub GetAllSerialPortsName()
Try
Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_PnPEntity")
For Each queryObj As ManagementObject In searcher.Get()
If InStr(queryObj("Caption"), "(COM") > 0 Then
Console.WriteLine("serial port : {0}", queryObj("Caption"))
End If
Next
Catch err As ManagementException
MsgBox(err.Message)
End Try
End Sub
Mise à jour: vous pouvez également vérifier
if (queryObj["Caption"].ToString().StartsWith("serial port"))
au lieu de
if (queryObj["Caption"].ToString().Contains("(COM"))
J'ai essayé tellement de solutions ici qui ne fonctionnaient pas pour moi, affichant seulement certains des ports. Mais ce qui suit montrait Tous et leurs informations.
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%(COM%'"))
{
var portnames = SerialPort.GetPortNames();
var ports = searcher.Get().Cast<ManagementBaseObject>().ToList().Select(p => p["Caption"].ToString());
var portList = portnames.Select(n => n + " - " + ports.FirstOrDefault(s => s.Contains(n))).ToList();
foreach(string s in portList)
{
Console.WriteLine(s);
}
}
}
Je ne sais pas trop ce que vous entendez par "trier les éléments après l'index 0", mais si vous voulez simplement trier le tableau de chaînes renvoyé par SerialPort.GetPortNames()
, vous pouvez utiliser Array.Sort .