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