Как получить «дружественное» имя последовательного порта в Mono и сохранить его кроссплатформенным - PullRequest
4 голосов
/ 13 января 2009

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

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

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

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 28 января 2009

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

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

2 голосов
/ 28 января 2009

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

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

Обновление:

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

0 голосов
/ 04 июня 2009

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

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

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

0 голосов
/ 27 февраля 2009

Код:

    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

0 голосов
/ 30 января 2009

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

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

...