Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.04.05;
Скачать: CL | DM;

Вниз

Нe удается открыть вирт. ком-порт, работающий через usbser.sys   Найти похожие ветки 

 
Kolan ©   (2010-04-15 16:29) [40]


> Так вот, не получится ибо он уже занят.
>

Да, и скажут, что Отказано в доступе, а тут вообще говорят, что его нет. То есть в системе он есть, а CreateFile говорит, что нет.


 
Вариант   (2010-04-16 09:48) [41]

Попробовал поиграться с USB -> COM - действительно проблема существует с удалением и повторным открытием. Более того есть и такой неприятный момент, что USB устройство может посадить свой COM на уже имеющийся виртуальный порт.
Теперь о проблеме повторного открытия порта. Если USB устройство у меня удалялось в момент, когда порт не использовался, не был открыт какой-либо программой ( или был открыт и корректно закрыт), то проблемы в дальнейшем собственно не возникало. Удаление и последуещеее добавление USB девайса не влияло на повторное открытие COM порта. Если же удаление происходило при не закрытом HANDLE порта то у меня затем на команде CloseHandle происходило зависание на более чем 30 секунд или второй вариант - вставлял устройство пока программа висела, и в этом случае CloseHandle завершал работу раньше.  И после этого могла возникнуть описанная автором топика проблемная ситуация(но не всегда).
И так ->
При мониторинге добавления или удаления устройств -  обрабатывал сообщение WM_DEVICECHANGE - я видел следующее:

Вариант 1 - Вставил устройство
Пришли сообщения -> Добавлена последовательность COM портов.
Я открыл порт. Закрыл порт. Удалил устройство из USB.
Пришли сообщения -> Удалена последовательность COM портов.

Это нормальный режим работы, после него при включении USB устройства порты нормально открываются.

Вариант 2   - Вставил устройство

Пришли сообщения -> Добавлена последовательность COM портов(на самом деле несколько сообщений, по одному на каждый порт).
Я открыл порт.
Удалил устройство из USB.
Попытался закрыть порт.  Я не дождался завершения работы CloseHandle - прервал процесс  - в этом случае при повторном ключении USB устройства порты не открывались. Правда для устранения ошибки достаточно было удалить USB устройство и снова его вставить в то же гнездо.

Вариант 3   - Вставил устройство
Пришли сообщения -> Добавлена последовательность COM портов .
Я открыл порт.
Удалил устройство из USB.
Попытался закрыть порт. Дождался завершения работы CloseHandle (более 30 сек). в этом случае при повторном ключении USB устройства порты нормально открылись. (прим Сообщений об удалении устройств не получил)

Вариант 4   - Вставил устройство
Пришли сообщения -> Добавлена последовательность COM портов .
Я открыл порт.
Удалил устройство из USB.
Попытался закрыть порт. Не дожидаясь конца работы CLoseHandle снова вставил в USB устройство. Дождался завершения CloseHandle. ПОлучил
сообщения -> Добавлена последовательность COM портов (в дистпечере устройств порты появились).
Пришли сообщения -> Удалена последовательность COM портов.
(но в дистпечере устройств порты остались).  В этом случае повторно открыть порт не могу.

Вариант 5 (то же что и 4 но концовка другая, счастливая)   - Вставил устройство
Пришли сообщения -> Добавлена последовательность COM портов .
Я открыл порт.
Удалил устройство из USB.
Попытался закрыть порт. Не дожидаясь конца работы CLoseHandle снова вставил в USB устройство. Дождался завершения CloseHandle. ПОлучил
сообщения -> Добавлена последовательность COM портов (в дистпечере устройств порты появились). После чего повторно смог открыть порт.

Резюме - Не надо удалять устройство при работающих с ним программах. Если это случилось - надо все равно закрывать HANDLE порта (пусть долго но надо). Надо анализировать возвращаемые результаты всех функций и причины ошибок заносить хотя бы в лог - это помогает. Если возникает описанная автором ошибка порта, то в интерактивной програме - надо просто попросить пользователя переподключить устройство.


 
Kolan ©   (2010-04-16 10:09) [42]

Вариант 1 - Вставил устройство
Пришли сообщения -> Добавлена последовательность COM портов.
Я открыл порт. Закрыл порт. Удалил устройство из USB.
Пришли сообщения -> Удалена последовательность COM портов.


Тут еще вот какое дело. Это драйвер не шлет таких сообщение, гад. Он шлет только DBT_DEVNODES_CHANGED.

http://delphimaster.net/view/1-1268895548/


 
Kolan ©   (2010-04-16 10:27) [43]

Вроде получилось. Сделал так, что при отключении устройства порт закрывается. Тестирую, пока работает.


 
Вариант   (2010-04-16 10:29) [44]

Я бы все же из интереса даже попробовал подписаться на нотификацию, просто проверить прийдет инфо или нет. Ибо про DBT_DEVNODES_CHANGED все же написано, что имеет смысл.  
И для меня это первый опыт так сказать подобной проблемы. У нас работали  с нашими программами для RS232 через USB. Но о такой проблеме мы не задумывались как-то. Не удаляют у нас устройств на ходу....


 
Kolan ©   (2010-04-16 11:16) [45]

Я не понял как подписываться на нотификацию и что я буду получать в случае с портом.

Я тоже не сталкивался раньше с такими странностями, так как раньше DBT_DEVICEARRIVAL с DBT_DEVTYP_PORT всегда приходило.


 
Вариант   (2010-04-16 11:59) [46]


> Kolan ©   (16.04.10 11:16) [45]


> Я не понял как подписываться на нотификацию и что я буду
> получать в случае с портом.
>

через RegisterDeviceNotification, сам с этим не работал, описание и пример http://msdn.microsoft.com/en-us/library/aa363431(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa363432(v=VS.85).aspx, ну или в гугле наверняка можно найти

А вот что будешь получать - это вопрос, те же WM_DEVICE_CHANGE будет приходить, но будет ли там DBT_DEVICEARRIVAL я не знаю. Если попробуешь - узнаешь - сообщи сюда, мне тоде интересно. Но у меня такого как DBT_DEVNODES_CHANGED не приходит, а потому проверить сам не могу.


 
Kolan ©   (2010-04-16 12:21) [47]

Скорее всего не буду докапываться, потому что, вроде, работает нормально.

Благодарю участников обсуждения за ответы.



Страницы: 1 2 вся ветка

Текущий архив: 2015.04.05;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.005 c
15-1407775454
Друг
2014-08-11 20:44
2015.04.05
О QuickSort не говори


4-1270793885
Kolan
2010-04-09 10:18
2015.04.05
Нe удается открыть вирт. ком-порт, работающий через usbser.sys


15-1408134602
Юрий
2014-08-16 00:30
2015.04.05
С днем рождения ! 16 августа 2014 суббота


15-1408780377
KSergey
2014-08-23 11:52
2015.04.05
Инициирование выполнеия кода в другом приложении


15-1405510044
Kerk
2014-07-16 15:27
2015.04.05
Behavior-driven development (BDD) в Delphi