Как разблокировать COM порт

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

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

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


person Tomasz Smykowski    schedule 13.01.2009    source источник


Ответы (2)


Нет хорошего, простого пути:

  • Хороший способ - исправить другое приложение; или, если это невозможно, написать драйвер фильтрующего устройства (аналогичный драйверу parport, но для последовательных портов вместо параллельных портов), который бы располагался поверх аппаратного драйвера последовательного порта и открывал бы более одной точки подключения (один, используемый другое приложение, которое передается базовому реальному драйверу, и еще одна «задняя дверь», используемая вашим собственным приложением ... реальный драйвер будет видеть только одного клиента, то есть драйвер фильтра, который находится поверх него)
  • Простой способ - заблокировать (принудительно завершить) другой процесс.
person ChrisW    schedule 13.01.2009

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

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

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

  1. GUID для COM-портов: {4d36e978-e325-11ce-bfc1-08002be10318} (CLSID_Ports)
  2. "путь экземпляра" порта, который вы хотите сбросить

Поскольку вы говорите, что хотите сбросить все порты, вы захотите изменить библиотеку в этом примере, чтобы перебрать все порты, изменив:

// 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);
}
person Compholio    schedule 04.08.2017