Comment puis-je obtenir le & # 8220; convivial & # 8221; nom du port série dans Mono et conservez-le sur plusieurs plates-formes

StackOverflow https://stackoverflow.com/questions/438029

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".

Était-ce utile?

La solution

Autant que je sache, il n’existe pas de paramètre "convivial". nom pour les périphériques COMM sous Linux. Ce que je vous suggère d’utiliser, c’est d’utiliser le répertoire / dev / ttyS # comme nom de périphérique dans un environnement Linux et de les répertorier sous le nom COMM # dans Windows.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top