Как разблокировать COM-порт
-
22-07-2019 - |
Вопрос
У меня есть приложение, которое должно работать после другого приложения.В этом втором приложении обнаружена ошибка, из-за которой COM-порты не закрываются при определенных обстоятельствах.
Я хотел бы программно закрыть все COM-порты в моем приложении, чтобы гарантировать, что не будет сообщений об ошибках при закрытии портов.Возможно ли это, если у меня нет объектов, которые открывали COM-порты?
Мне нужно решение на .NET Framework, C #.
Решение
Нет хорошего, простого способа:
- A хорошо способ состоит в том, чтобы исправить другое приложение;или, если это невозможно, написать драйвер устройства фильтрации (аналогичный драйверу parport, но для последовательных портов вместо параллельных портов), который располагался бы поверх аппаратного драйвера последовательного порта и который предоставлял бы более одной точки подключения (одна используется другим приложением, которая проходит через базовый реальный драйвер, и другая "задняя дверь", используемая вашим собственным приложением ...реальный драйвер будет видеть только одного клиента, т.е.драйвер фильтра, который находится поверх него)
- Ан легко способ состоит в том, чтобы уничтожить (принудительно завершить) другой процесс.
Другие советы
Я недавно столкнулся с этим и хочу добавить немного ... Большинство драйверов COM-портов " разблокировать " порт, когда устройство включено и отключено в диспетчере устройств. Это означает, что (C #) способ решения этой задачи описан в решении:
Функция Win32 API для программного включения / отключения устройства р>
Информация, которую вам необходимо знать, чтобы использовать это решение для COM-портов:
<Ол>Поскольку вы говорите, что хотите сбросить все порты, вам нужно изменить библиотеку в этом примере, чтобы она зациклилась на всех портах, изменив:
// 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);
}