Как найти последовательный или TCP-конвертер на COM-порт по его имени или идентификатору? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть программа, в которой я использую конвертер на COM-порту для связи с теплицей, я получаю от нее данные и т. Д. Всякий раз, когда я открываю программу, и она еще не настроена с правильным COM-портом, я идутам и настраивают его нормально, но тогда возникает сомнение, а если у клиента более одного COM-порта на компьютере?Как я могу сделать фильтр, в котором появляется только мой конвертер?(он больше не является общим и имеет название компании и другой идентификатор)

1 Ответ

3 голосов
/ 26 апреля 2019

Вот некоторый код, который ищет все последовательные порты, которые содержат данное понятное имя устройства (имя, отображаемое в диспетчере устройств).

Так что, если диспетчер устройств содержит:

device manager

AutofindComPort("Prolific")

Возвращает список, содержащий «COM30».

Если вы предпочитаете выполнять поиск по vid / pid, это также возможно с некоторыми незначительными изменениями.

Для этого кода необходимо добавить ссылку на System.Management.

/// <summary>
/// Find all com ports that contain the given friendly device name. i.e.
/// AutofindComPort("Prolific") would return a list with the values "COM1",
/// and "COM3". If the device manager listed
/// "Prolific USB-to-Serial Comm Port (COM1)" and
/// "Prolific USB-to-Serial Comm Port (COM3)".
/// </summary>
/// <param name="deviceName">The friendly name of the device to find com
/// ports for.</param>
/// <returns>The com port names the device(s) are attached to.</returns>
private List<string> AutofindComPort(string deviceName)
{
  List<ManagementBaseObject> devs = GetDevices(deviceName);

  // Get the com ports from the ManagementBaseObject.
  List<string> comnames = new List<string>();
  foreach (ManagementBaseObject dev in devs)
  {
    comnames.Add(
      ParsePortNameFromFriendlyName((string)dev.GetPropertyValue("Name")));
  }

  return comnames;
}

/// <summary>
/// Search through the devices connected to the computer, looking for any
/// that contain the given device name and "COM" in their friendly name.
/// </summary>
/// <returns>All of the matching devices found.</returns>
private List<ManagementBaseObject> GetDevices(string deviceName)
{
  // Getting a list of all available com port devices and their friendly
  // names. source:   
  // http://www.codeproject.com/KB/system/hardware_properties_c_.aspx   
  List<ManagementBaseObject> devices = new List<ManagementBaseObject>();

  using (ManagementObjectSearcher searcher
    = new ManagementObjectSearcher("Select * from Win32_PnpEntity"))
  {
    foreach (ManagementBaseObject device in searcher.Get())
    {
      object nameo = device.GetPropertyValue("Name");
      if (nameo != null)
      {
        string name = (nameo as string);

        // Only add item if the friendly names contains "COM" and the device
        // name we want.
        if (name.Contains("(COM") && name.Contains(deviceName))
        {
          devices.Add(device);
        }
      }
    }
  }

  return devices;
}

/// <summary>
/// Parse the port name ("COM30") from the friendly device name ("Prolific
/// USB-to-Serial Comm Port (COM30)").
/// </summary>
/// <param name="friendlyName">The friendly device name to parse.</param>
/// <returns>The com port name.</returns>
private string ParsePortNameFromFriendlyName(string friendlyName)
{
  Match m = Regex.Match(friendlyName, @".*\((COM\d+)\).*");
  if (m.Success)
  {
    return m.Groups[1].Captures[0].Value;
  }
  else
  {
    return string.Empty;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...