Comment puis-je obtenir le & # 8220; convivial & # 8221; nom du port série dans Mono et conservez-le sur plusieurs plates-formes
-
22-07-2019 - |
Question
J'ai posé cette question:
Port série (rs232) en mono pour plusieurs plates-formes
et celui-ci est lié:
Comment puis-je obtenir le message convivial nom d’un port COM sous Windows?
Mais je veux pouvoir obtenir le "convivial" " nom sur Windows - et éventuellement aussi sur linux / mac s’il existe une telle chose.
Existe-t-il un moyen multi-plateforme de le faire ou est-ce que je n'ai pas de chance?
Voici ce que je fais dans mon application actuelle - et cela fonctionne très bien pour Win32 en C ++ natif.
http://www.naughter.com/enumser.html
En tout cas, cela ne semble pas être une jolie solution pour la distribution multiplate-forme. Quelqu'un a-t-il des suggestions?
EDIT - car les gens ont du mal à comprendre ce que je demande: à titre d'exemple - COM9 n'est pas un nom convivial. Je veux quelque chose qui dit "COM9 - ??Connecteur USB". ou quelque chose comme ça. Ceci est possible avec le lien ci-dessus dans Win32. C’est méchant et hacky, mais bien souvent, les utilisateurs finaux n’ont aucune idée du port COM à ouvrir dans mon programme, sauf s’il existe un nom utile - plus utile que "COMn".
La solution
Les utilisateurs de Linux comprendront la terminologie, vous ne devriez donc pas vous inquiéter.
Autres conseils
Pensez à examiner la méthode statique SerialPort.GetPortNames ()
. Il est disponible dans .NET 2.0 et semble avoir été implémenté également dans Mono. Selon http://www.go-mono.com/docs/>la page de documents mono, GetPortNames existe sur l'objet de port série Mono, je lui donnerais donc une chance.
S'il est implémenté, il devrait vous renvoyer un tableau C # de chaînes contenant les noms de port disponibles sur votre ordinateur. Ceux-ci devraient avoir un sens pour tout système d'exploitation sous-jacent que vous avez. Par exemple, dans Windows, il renverra COM1, COM2, COM4, ??etc. Il devrait renvoyer la chaîne requise pour la propriété PortName
.
Mise à jour:
Jetez un coup d'œil à une publication de la liste de diffusion mono-dev , il semble que cela fonctionne dans les environnements * nix.
Essayez la requête suivante dans WMI:
"Sélectionner le nom dans Win32_PnPEntity" et recherchez des objets contenant "COM", par exemple, un périphérique de conversion USB-série est installé sur mon ordinateur:
Convertisseur USB-série USB60FPW (COM6)
Vous devez envisager de faire WMI. Je n'ai pas été capable de le faire moi-même, mais si vous combinez ce cadre de base comment extraire un objet WMI avec cela documentation de la classe Win32_SerialPort
, je pense que vous pouvez trouver une solution.
En gros, vous voulez obtenir une collection de tous les Win32_SerialPort
du système, puis les parcourir. Vous voudrez peut-être utiliser les champs "Légende", ou "Description", ou simplement "Nom". Le meilleur conseil que je puisse vous donner est de définir un point d'arrêt et de vérifier les propriétés de l'objet en mode débogage afin de déterminer exactement ce qui est rempli.
Code:
public static ArrayList GetComFriendlyNames()
{
ArrayList names = new ArrayList();
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\WMI",
"SELECT InstanceName, PortName FROM MSSerial_PortName");
foreach (ManagementObject port in searcher.Get())
{
names.Add(port["PortName"] + " - " + port["InstanceName"]);
}
}
catch (ManagementException)
{
}
return names;
}
utilisation:
ArrayList ports = GetComFriendlyNames();
foreach (string name in ports)
{
Console.WriteLine(name);
}
exemple de sortie:
COM1 - ACPI \ PNP0501 \ 1_0
COM2 - ACPI \ PNP0501 \ 2_0
COM3 - FTDIBUSVID_0000 + PID_0000 + 0 & 0000000 & amp; 0 & amp; 0? 000_0