Como faço para obter o nome “amigável” de porta serial em Mono e mantê-lo de plataforma cruzada

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

Pergunta

Eu fiz esta pergunta:
Porta Serial (RS232) em Mono para múltiplas plataformas

e este é relacionada:
Como faço para obter o amigável nome de uma porta COM no Windows?

Mas eu quero ser capaz de obter o nome "amigável" em Windows e, possivelmente, também no linux / mac, se é que existe tal coisa.

Existe alguma maneira de plataforma cruzada para fazê-lo, ou estou fora da sorte?

Aqui está o que eu estou fazendo no meu aplicativo atual - e ele funciona muito bem para win32 nativo C ++.

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

Em qualquer caso, não parece ser uma solução muito para a distribuição multi-plataforma. Alguém tem alguma sugestão?

EDIT - já que as pessoas estão tendo dificuldade para entender o que estou pedindo: como um exemplo - COM9 não é um nome amigável. Eu quero algo que diz "COM9 - ??conector USB" ou algo parecido. Isso é possível com o link acima no Win32. É desagradável e hacky, mas muitas vezes os usuários finais não têm idéia do que porta COM eles precisam para abrir no meu programa a menos que haja um nome útil - "COMn" mais útil do que

Foi útil?

Solução

AFAIK não há nenhum nome "amigável" para os dispositivos COMM em linux. O que eu sugiro que você faz é usar o / dev / ttyS # como o nome do dispositivo em um ambiente Linux e lista-los como COMM # no Windows.

Os usuários de Linux vai entender a terminologia por isso não deve ser uma preocupação lá.

Outras dicas

Considere olhar para o método SerialPort.GetPortNames() estática. Ele está disponível no .NET 2.0, e parece que ele é implementado em Mono também. De acordo com http://www.go-mono.com/docs/>the mono página docs, GetPortNames existe no objeto porta serial Mono, então eu iria dar-lhe um tiro.

Se ele é implementado, ele deve retornar uma matriz C # de strings contendo os nomes das portas disponíveis no seu computador. Estes devem fazer sentido para o que subjacente OS você tem. Por exemplo, em janelas que vai voltar COM1, COM2, COM4, ??e assim por diante. Ele deve retornar a corda necessária para a propriedade PortName.

Update:

Dando uma olhada um post de a lista de discussão mono-dev parece que ela não funciona em ambientes * nix.

Tente a seguinte consulta no WMI:

"Selecionar nome de Win32_PnPEntity" e procurar por objetos que contêm "COM", por exemplo, eu tenho um dispositivo conversor USB-Serial instalado no meu computador:

USB60FPW conversor USB-Serial (COM6)

Você precisa olhar para fazer WMI. Eu não tenho sido capaz de executar isso mesmo, mas se você combinar esta estrutura básica de como recuperar um objeto WMI com este documentação da classe Win32_SerialPort, eu acho que você pode trabalhar em algo.

Basicamente, você quer ter uma coleção de todos os Win32_SerialPorts no sistema, em seguida, iterar através deles. Você pode querer o "Legenda", ou "Descrição", ou talvez apenas "Nome". Meu melhor conselho é apenas para definir um ponto de interrupção e verificar as propriedades do objeto no modo de depuração para que você possa descobrir exatamente o que é preenchido.

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

exemplo de saída:

COM1 - ACPI \ pnp0501 \ 1_0

COM2 - ACPI \ pnp0501 \ 2_0

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top