Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2015.04.05;
Скачать: [xml.tar.bz2];

Вниз

Н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 вся ветка

Форум: "WinAPI";
Текущий архив: 2015.04.05;
Скачать: [xml.tar.bz2];

Наверх





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


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


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


15-1407842581
БарЛог
2014-08-12 15:23
2015.04.05
Комбинаторная задачка про NUM-клавиатуру


15-1408434187
Пашка.
2014-08-19 11:43
2015.04.05
Принципы ООП





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский