2009-04-16 3 views
1

Я работаю над приложением C++ Win32, для которого я пытаюсь существенно «автоматически обнаружить», если устройство подключено к одному из портов RS232 а затем, если он был отключен.Определите, подключено или отсоединено устройство к порту RS232, не открывая порт.

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

Обнаружение отключения - вот где я столкнулся с проблемой. Когда я просматриваю подключенные устройства, я могу отправить данные на порт, чтобы убедиться, что, если есть устройство, это конкретное устройство, которое я ищу. Но как только он будет подключен, этот порт уже будет открыт другим процессом, и я больше не могу открыть этот порт из потока обнаружения. Поэтому я ищу способ открыть порт в «режиме прослушивания» или что-то в этом роде, чтобы я мог просто увидеть, все еще есть устройство.

Я коротко натолкнулся на что-то о просмотре линии DSR или DTR или что-то в этом роде ... но не смог найти больше или как это сделать на самом деле.

Любые предложения?

Edit: Похоже, мне нужно прояснить немного больше ... Для обнаружения отключиться, я не может передавать данные в порт RS232 каким-либо образом. Кроме того, я не могу предположить, что другое приложение фактически открыто для порта. Устройство может быть физически подключено, но без и открытого соединения ... но я по-прежнему не могу рисковать отправлять ему данные. Я надеялся, что есть способ проверить, что в этом порту еще есть сила или что-то в этом роде.

ответ

4

Это зависит от подключенного оборудования, независимо от того, произойдет ли изменение регистра состояния модема при отключении оборудования, но если есть возможность проверить состояние, например, линии CTS или DSR, используя функцию GetCommModemStatus().

Существует, однако, проблема, что вам нужен дескриптор файла к COM порту для вызова любой функции API, и это исключительно в качестве документации CreateFile() состояний:

Функция CreateFile может создать дескриптор ресурс связи, такой как последовательный порт COM1. Для коммуникационных ресурсов, параметр dwCreationDisposition должен быть OPEN_EXISTING, параметр dwShareMode должен быть равен нулю (монопольный доступ)

Таким образом, вы не можете открыть COM-порт для просмотра состояния линии в то время как другой процесс порт открыт для общения.

Есть способы сделать это, но они включают в себя драйвер. SysInternals имеет Portmon tool, и поиск Google заставит некоторые компании продавать программное обеспечение для совместного доступа к COM-порт между приложениями, но одновременный доступ AFAIK невозможно с использованием стандартного API.

+0

Большое пояснение, спасибо. К сожалению, я не могу получить доступ на уровне драйвера ... но я могу хотя бы получить дескриптор порта, который уже открыт, поэтому я могу проверить. –

+0

Еще одна мысль ... есть ли способ попытаться подключиться к порту, где он потерпит неудачу, если есть уже соединение? Таким образом, если он не работает с предыдущим соединением или просто подключается, я знаю, что он все еще существует. –

+0

Конечно, просто попробуйте открыть порт и проверьте результат GetLastError(), если он терпит неудачу. Это скажет вам, открыт ли порт. Он не говорит вам, все еще подключено устройство. Для этого вам необходим периодический обмен данными или используйте GetCommModemStatus() в другом процессе. – mghie

1

Похоже, что было бы неплохо, если бы этот процесс, который даст уведомление о подключенных и отключенных событиях, также передаст данные другому процессу. Попросите приложение работать в таких слоях, что есть процесс, который управляет соединением RS232 и отправляет события вашего приложения верхнего уровня: подключен, отключен, доступны данные и т. Д.

+0

К сожалению, это не вариант. Процесс, который на самом деле использует соединение, должен иметь полный контроль над связью ... длинная история, но это именно то, как она была разработана. –

+0

есть ли способ, которым вы можете связать соединение в своем собственном классе, который будет осуществлять мониторинг и предоставлять все функции, которые вызывает процесс? – ThePosey

+0

нет ... к сожалению, он должен быть полностью неинтрузивным –

0

Я сделал такие приложения, проблема с языком (если у вас нет доступа к последовательному порту на вашем языке).

Мое предпочтительное решение всегда состояло из одного потока на порт в соответствии с вашей конфигурацией, и поток поддерживает состояние, доступное из какого-то контроллера.

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

Я разработал приложение, имеющее несколько очередей: один с отключенными потоками, один с подключенными, но бездействующими потоками и другой с подключенными и занятыми потоками. Контроллер перемещал потоки между очередями, когда они меняли состояние.

Смежные вопросы