.net linux mono cross-platform serial-port

.net - ¿Cómo obtengo el nombre "amigable" del puerto serie en Mono y lo mantengo en la plataforma cruzada?



linux cross-platform (5)

AFAIK no hay un nombre "amigable" para los dispositivos COMM en Linux. Lo que 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 comprenderán la terminología, por lo que no deberían preocuparse.

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

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

Pero quiero ser capaz de obtener el nombre "amigable" 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 Win32 nativo de C ++.

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 fácil de usar. 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".


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 mono documentos, GetPortNames existe en el objeto del puerto serie Mono, así que le daría una oportunidad.

Si se implementa, debería devolverte una matriz C # de cadenas que contengan nombres de puertos disponibles en tu computadora. Esto debería tener sentido para cualquier sistema operativo subyacente que tengas. Por ejemplo, en Windows devolverá COM1, COM2, COM4, ​​y así sucesivamente. Debería devolver la cadena necesaria para la propiedad PortName .

Actualizar:

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


Necesitas ver hacer WMI. No he podido ejecutarlo yo mismo, pero si combina este marco básico de cómo recuperar un objeto WMI con esta documentación de la clase Win32_SerialPort , creo que puede 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 "Descripción", o tal vez simplemente "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 averiguar 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); }

ejemplo de salida:

COM1 - ACPI / PNP0501 / 1_0

COM2 - ACPI / PNP0501 / 2_0

COM3 - FTDIBUSVID_0000 + PID_0000 + 0 y 0000000 & 0 & 0? 000_0


Pruebe la siguiente consulta en WMI:

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

Convertidor USB-Serial USB60FPW (COM6)