Как мне получить “понятное” имя последовательного порта в Mono и сохранить его кроссплатформенным

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

Вопрос

Я задал этот вопрос:
Последовательный порт (rs232) в монофоническом режиме для нескольких платформ

и это связано с:
Как мне получить понятное имя COM-порта в Windows?

Но я хочу иметь возможность получить "дружественное" имя в Windows - и, возможно, также в linux / mac, если такое существует.

Есть ли какой-нибудь кроссплатформенный способ сделать это, или мне не повезло?

Вот что я делаю в своем текущем приложении - и оно отлично работает для родного C ++ win32.

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

В любом случае это не похоже на красивое решение для кроссплатформенного распространения.У кого-нибудь есть какие-нибудь предложения?

РЕДАКТИРОВАТЬ - поскольку у людей возникают проблемы с пониманием того, о чем я прошу:в качестве примера - COM9 не является дружественным именем.Я хочу что-нибудь с надписью "COM9 - USB разъем" или что-то в этом роде.Это возможно с помощью приведенной выше ссылки в Win32.Это неприятно и халтурно, но часто конечные пользователи понятия не имеют, какой COM-порт им нужно открыть в моей программе, если только там нет полезного имени - более полезного, чем "COMn".

Это было полезно?

Решение

AFAIK, в Linux нет "дружественного" названия для устройств связи.Что я предлагаю вам сделать, так это использовать /dev/ttyS# в качестве имени вашего устройства в среде Linux и перечислить их как COMM # в Windows.

Пользователи Linux поймут терминологию, так что беспокоиться не о чем.

Другие советы

Подумайте о том, чтобы взглянуть на SerialPort.GetPortNames() статический метод.Он доступен в .NET 2.0, и, похоже, он реализован и в Mono.Согласно http://www.go-mono.com/docs /> странице mono docs, GetPortNames существует для объекта Mono serial port, поэтому я бы попробовал.

Если это реализовано, оно должно вернуть вам массив строк C #, содержащий имена портов, доступных на вашем компьютере.Это должно иметь смысл для любой базовой операционной системы, которая у вас есть.Например, в Windows он вернет COM1, COM2, COM4 и так далее.Он должен возвращать строку, необходимую для PortName собственность.

Обновить:

Взглянув на сообщение из списка рассылки mono-dev похоже, что это действительно работает в средах * nix.

Попробуйте выполнить следующий запрос в WMI:

"Выберите имя из Win32_PnPEntity" и выполните поиск объектов, содержащих "COM", например, у меня на компьютере установлено устройство USB-Serial Converter:

USB60FPW USB-последовательный преобразователь (COM6)

Вам нужно подумать о создании WMI.Я не смог запустить это сам, но если вы объедините эта базовая структура о том, как извлечь объект WMI с помощью эта документация из числа Win32_SerialPort класс, я думаю, вы сможете что-нибудь придумать.

По сути, вы хотите получить коллекцию всех Win32_SerialPorts в системе, затем выполните итерацию по ним.Возможно, вам понадобится "Подпись", или "Описание", или, может быть, просто "Имя".Мой лучший совет - просто установить точку останова и проверить свойства объекта в режиме отладки, чтобы вы могли точно определить, что заполняется.

Код:

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

использование:

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

пример вывода:

COM1 - ACPI\PNP0501\1_0

COM2 - ACPI\PNP0501\2_0

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top