Вопрос

У меня есть приложение, которое должно работать после другого приложения.В этом втором приложении обнаружена ошибка, из-за которой COM-порты не закрываются при определенных обстоятельствах.

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

Мне нужно решение на .NET Framework, C #.

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

Решение

Нет хорошего, простого способа:

  • A хорошо способ состоит в том, чтобы исправить другое приложение;или, если это невозможно, написать драйвер устройства фильтрации (аналогичный драйверу parport, но для последовательных портов вместо параллельных портов), который располагался бы поверх аппаратного драйвера последовательного порта и который предоставлял бы более одной точки подключения (одна используется другим приложением, которая проходит через базовый реальный драйвер, и другая "задняя дверь", используемая вашим собственным приложением ...реальный драйвер будет видеть только одного клиента, т.е.драйвер фильтра, который находится поверх него)
  • Ан легко способ состоит в том, чтобы уничтожить (принудительно завершить) другой процесс.

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

Я недавно столкнулся с этим и хочу добавить немного ... Большинство драйверов COM-портов " разблокировать " порт, когда устройство включено и отключено в диспетчере устройств. Это означает, что (C #) способ решения этой задачи описан в решении:

Функция Win32 API для программного включения / отключения устройства

Информация, которую вам необходимо знать, чтобы использовать это решение для COM-портов:

<Ол>
  • GUID для COM-портов: {4d36e978-e325-11ce-bfc1-08002be10318} (CLSID_Ports)
  • " путь к экземпляру " порта, который вы хотите сбросить
  • Поскольку вы говорите, что хотите сбросить все порты, вам нужно изменить библиотеку в этом примере, чтобы она зациклилась на всех портах, изменив:

    // Find the index of our instance. i.e. the touchpad mouse - I have 3 mice attached...
    int index = GetIndexOfInstance(diSetHandle, diData, instanceId);
    // Disable...
    EnableDevice(diSetHandle, diData[index], enable);
    

    примерно так:

    for (int index = 0; index < diData.Length; index++)
    {
        EnableDevice(diSetHandle, diData[index], enable);
    }
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top