Pregunta

Hice esta pregunta:
Puerto serie (rs232) en Mono para múltiples plataformas

y este está relacionado:
¿Cómo consigo el amistoso? nombre de un puerto COM en Windows?

Pero quiero poder obtener el " amigable " nombre en Windows, y posiblemente también en linux / mac si existe tal cosa.

¿Hay alguna forma de plataforma cruzada para hacerlo, o no tengo suerte?

Esto es lo que estoy haciendo en mi aplicación actual, y funciona muy bien para C32 win32 nativo.

http://www.naughter.com/enumser.html

En cualquier caso, no parece una solución bonita para la distribución multiplataforma. ¿Alguien tiene alguna sugerencia?

EDITAR - ya que las personas tienen problemas para entender lo que estoy pidiendo: como ejemplo: COM9 no es un nombre descriptivo. Quiero algo que diga "COM9 - ??Conector USB" o algo así. Esto es posible con el enlace de arriba en Win32. Es desagradable y hacky, pero muchas veces los usuarios finales no tienen idea de qué puerto COM necesitan abrir en mi programa a menos que haya un nombre útil, más útil que "COMn."

¿Fue útil?

Solución

AFAIK no hay "amigable" nombre para los dispositivos COMM en Linux. Lo que le sugiero que haga es usar / dev / ttyS # como el nombre de su dispositivo en un entorno Linux y enumerarlos como COMM # en Windows.

Los usuarios de Linux entenderán la terminología, por lo que no debería preocuparse allí.

Otros consejos

Considere mirar el método estático SerialPort.GetPortNames () . Está disponible en .NET 2.0, y parece que también está implementado en Mono. De acuerdo con http://www.go-mono.com/docs/> la página de documentos mono, GetPortNames existe en el objeto de puerto serie Mono, así que lo probaría.

Si está implementado, debería devolverle una matriz C # de cadenas que contienen los nombres de puerto disponibles en su computadora. Estos deberían tener sentido para cualquier sistema operativo subyacente que tenga. Por ejemplo, en Windows devolverá COM1, COM2, COM4, ??etc. Debería devolver la cadena necesaria para la propiedad PortName .

Actualización:

Echando un vistazo a una publicación de la lista de correo mono-dev parece que funciona en entornos * nix.

Pruebe la siguiente consulta en WMI:

" Seleccionar nombre de Win32_PnPEntity " y buscar objetos que contengan " COM " ;, por ejemplo, tengo un dispositivo convertidor de serie USB instalado en mi computadora:

USB60FPW USB-Serial Converter (COM6)

Debes estudiar WMI. No he podido ejecutar esto yo mismo, pero si combina este marco básico de cómo recuperar un objeto WMI con this documentación de la clase Win32_SerialPort , creo que puedes resolver algo.

Básicamente, desea obtener una colección de todos los Win32_SerialPort s en el sistema, luego iterar a través de ellos. Es posible que desee el "Título", o la "Descripción", o tal vez solo el "Nombre". Mi mejor consejo es establecer un punto de interrupción y verificar las propiedades del objeto en modo de depuración para que pueda descubrir exactamente qué se llena.

Código:

    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;
    }

uso:

        ArrayList ports = GetComFriendlyNames();
        foreach (string name in ports)
        {
            Console.WriteLine(name);
        }

salida de ejemplo:

COM1 - ACPI \ PNP0501 \ 1_0

COM2 - ACPI \ PNP0501 \ 2_0

COM3 - FTDIBUSVID_0000 + PID_0000 + 0 & amp; 0000000 & amp; 0 & amp; 0? 000_0

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top