Как мне получить “понятное” имя последовательного порта в Mono и сохранить его кроссплатформенным
-
22-07-2019 - |
Вопрос
Я задал этот вопрос:
Последовательный порт (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_SerialPort
s в системе, затем выполните итерацию по ним.Возможно, вам понадобится "Подпись", или "Описание", или, может быть, просто "Имя".Мой лучший совет - просто установить точку останова и проверить свойства объекта в режиме отладки, чтобы вы могли точно определить, что заполняется.
Код:
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