Конференция "WinAPI" » Нe удается открыть вирт. ком-порт, работающий через usbser.sys
 
  • Kolan © (15.04.10 16:29) [40]

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

    Да, и скажут, что Отказано в доступе, а тут вообще говорят, что его нет. То есть в системе он есть, а CreateFile говорит, что нет.
  • Вариант (16.04.10 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 © (16.04.10 10:09) [42]
    Вариант 1 - Вставил устройство
    Пришли сообщения -> Добавлена последовательность COM портов.
    Я открыл порт. Закрыл порт. Удалил устройство из USB.
    Пришли сообщения -> Удалена последовательность COM портов.


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

    http://pda.delphimaster.net/?id=1268895548&n=0
  • Kolan © (16.04.10 10:27) [43]
    Вроде получилось. Сделал так, что при отключении устройства порт закрывается. Тестирую, пока работает.
  • Вариант (16.04.10 10:29) [44]
    Я бы все же из интереса даже попробовал подписаться на нотификацию, просто проверить прийдет инфо или нет. Ибо про DBT_DEVNODES_CHANGED все же написано, что имеет смысл.  
    И для меня это первый опыт так сказать подобной проблемы. У нас работали  с нашими программами для RS232 через USB. Но о такой проблеме мы не задумывались как-то. Не удаляют у нас устройств на ходу....
  • Kolan © (16.04.10 11:16) [45]
    Я не понял как подписываться на нотификацию и что я буду получать в случае с портом.

    Я тоже не сталкивался раньше с такими странностями, так как раньше DBT_DEVICEARRIVAL с DBT_DEVTYP_PORT всегда приходило.
  • Вариант (16.04.10 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 © (16.04.10 12:21) [47]
    Скорее всего не буду докапываться, потому что, вроде, работает нормально.

    Благодарю участников обсуждения за ответы.
 
Конференция "WinAPI" » Нe удается открыть вирт. ком-порт, работающий через usbser.sys
Есть новые Нет новых   [134431   +15][b:0][p:0]