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

    Есть железка, которая представляется как USB-функция и реализует ACM совместимый USB CDC профиль (это я написал под диктовку нашего «железячника»).

    Для подключение к Винде мы использовали драйвер usbser.sys из Виндоус Икс-Пи (второй сервис пак).

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

    Причем дело врядли в конкретной программе, так как доступ к порту в этом случае не может получить ни одна программа вообще (пробовали ZOC и пр.).

    Помогает только перетыкание USB в другой порт, при этом появляется ком-порт с другим номером и открытие файла проходит успешно. Если после этого воткнуть USB обратно (туда, где только что не работало), открытие снова работает.

    Вопросы: В чем может быть дело? Как это исправить?
  • brother © (09.04.10 10:31) [1]
    > Проблема в том, что при определенных действиях (гарантировано
    > воспроизвести не удаётся, но это происходит при физическом
    > отключении железки от порта
    ) виртуальный ком-порт определяется
    > в системе (виден в списке оборудование), а работать с ним
    > не удается
    , функция открытия файла завершается с ошибкой
    > «Не удается найти указанный файл.»

    если отключили, то с чего бы ему работать? не понял, в чем проблемма?
  • Дмитрий Белькевич (09.04.10 10:41) [2]
    Думаю, что наиболее вероятны глюки в драйвере железяки.
  • Kolan © (09.04.10 12:01) [3]
    «если отключили, то с чего бы ему работать? не понял, в чем проблемма?»

    Был 19 порт. Отключили. Порт пропал. Подключили снова. Снова появился 19 порт, но открыть его не получается.

    Дальше можно переключать до посинения, пока в другой разъем не переткнешь, чтобы 18 порт определился, открыть не получится.
  • Kolan © (09.04.10 12:13) [4]
    В железке стоит uClinux и используется 527 BlackFin, в котором уже есть поддержка USB. Соответственно используются стандартные драйвера. Профиль CDC реализован Линуксом (модуль g_serial).

    Кроме того, при подключении железки к компьютеру с Линуксом проблем не наблюдается.
  • Kolan © (09.04.10 13:31) [5]
    Мне кажется дело в том, что когда программа отрыта — она занимает ком порт. Если я отключаю USB во время работы программы, то он пропадает из системы, но остается, видимо, занятым.

    Когда я возвращаю USB назад, то, наверно, та занятость порта как-то  мешает работе с новым.

    Есть идеи по этому поводу.
  • Германн © (09.04.10 13:48) [6]

    > Есть идеи по этому поводу.

    Идеи есть. Слов нет литературных.
  • Германн © (09.04.10 14:04) [7]

    > Kolan ©   (09.04.10 13:31) [5]

    Как с портом работаешь?
  • Kolan © (09.04.10 14:13) [8]
    Ну ты попробуй, все-таки.
  • Kolan © (09.04.10 14:14) [9]
    Открываю в начале программы, закрываю в конце.
  • Германн © (09.04.10 14:15) [10]

    > Kolan ©   (09.04.10 14:14) [9]
    >
    > Открываю в начале программы, закрываю в конце.
    >

    Доппотоки используешь?
  • Kolan © (09.04.10 14:20) [11]
    Я использую компонент nrCommLib. Он, вроде, использует.
  • Kolan © (09.04.10 16:35) [12]
    Что-то еще нужно? Исходники nrCommLib есть, если нужно — могу детальнее описать что и как.
  • Германн © (10.04.10 00:38) [13]

    > Kolan ©   (09.04.10 14:20) [11]

    Ты же вроде что-то пробовал с tpapro?
    Проверено на возможно похожей железяке (микросхема FT232RL). Tapdcomport проблем не вызывает. В то время как программы (созданные двумя моими знакомыми) читающие/пишущие в СОМ-порт в доппотоках при отключении этой железяки от USB порта обязательно вызывают какой-нибудь кошмар. По-моему было как-то подобное твоему эффекту. Но чаще всего этот эффект затмевается тем, что происходит полное зависание системы, которое снимается только эникеем.
  • GanibalLector © (10.04.10 00:58) [14]
    А смотрел, что вообще происходит с портом ? Есть же PortMon. Открой и посмотри. Все сразу ясно станет.

    Там ты увидишь, закрывается порт или нет.

    З.Ы. А вообще, "домашку" пора делать ))
  • Германн © (10.04.10 02:07) [15]

    > GanibalLector ©   (10.04.10 00:58) [14]
    >
    > А смотрел, что вообще происходит с портом ? Есть же PortMon.
    >  Открой и посмотри. Все сразу ясно станет.
    >
    > Там ты увидишь, закрывается порт или нет.
    >

    Уверен что не увидит. Или увидит но не то.
  • Германн © (10.04.10 02:10) [16]

    > Дмитрий Белькевич   (09.04.10 10:41) [2]
    >
    > Думаю, что наиболее вероятны глюки в драйвере железяки.

    Хоть и возможно, но вряд ли. Заметь что автор использовал драйвер от MS.
  • Германн © (10.04.10 02:15) [17]
    В целом я считаю правильным перемещение топика в WinAPI. Но боюсь толку от этого будет немного. Бо тут "непаханное поле".
    Идиотские преобразователи USB <--> UART.
    Непонятные драйвера к ним.
    И плюс дебильная работа с СОМ-портом. Не сочтите за хамство. (с) Jeer
  • Anatoly Podgoretsky © (10.04.10 09:56) [18]
    > Германн  (10.04.2010 02:15:17)  [17]

    У нас кроме WinAPI еще есть и Для Начинающих и Прочее, так что в сложных случаях есть куда перемещать.

    По преобразователям и по драйверам согласен, типичные китайско/индуские поделки. Но других то нет.
  • Kolan © (10.04.10 12:09) [19]

    > Ты же вроде что-то пробовал с tpapro?

    На него забили, он странно подвисал при работе с зед-модемом. Купили nrComm.

    Но компонент тут не причем. Я просто пишу
    CreateFile

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


    > Идиотские преобразователи USB <--> UART.

    Их нету. Никаких китайских. На железке стоит USB разъем, который (простите я дилетант) поддерживается самим процессором.

    Портмоном смотрел

    Вот закрытие, когда пока работала программа выдернул USB.

    697 12:00:10 miniCalibrator. IRP_MJ_READ USBSER000 SUCCESS Length 8: root:~>  
    698 12:00:10 miniCalibrator. IOCTL_SERIAL_GET_MODEMSTATUS USBSER000 SUCCESS  
    699 12:00:53 miniCalibrator. IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS  
    700 12:00:53 miniCalibrator. IOCTL_SERIAL_SET_WAIT_MASK USBSER000 SUCCESS Mask:  
    701 12:00:53 miniCalibrator. IRP_MJ_CLEANUP USBSER000 SUCCESS  
    702 12:00:53 miniCalibrator. IRP_MJ_CLOSE USBSER000 SUCCESS  



    Вот когда не выдергивал.

    895 12:04:23 miniCalibrator. IRP_MJ_READ USBSER001 SUCCESS Length 8: root:~>  
    896 12:04:23 miniCalibrator. IOCTL_SERIAL_GET_MODEMSTATUS USBSER001 SUCCESS  
    897 12:04:29 miniCalibrator. IOCTL_SERIAL_GET_COMMSTATUS USBSER001 SUCCESS  
    898 12:04:29 miniCalibrator. IOCTL_SERIAL_SET_WAIT_MASK USBSER001 SUCCESS Mask:  
    899 12:04:29 miniCalibrator. IRP_MJ_CLEANUP USBSER001 SUCCESS  
    900 12:04:29 miniCalibrator. IRP_MJ_CLOSE USBSER001 SUCCESS  



    Разницы нет.

    Портмону, тоже плохеет, кстати. Если он подцепился на 19 порт, и потом переткнуть USB — ничего не показывает.

    Может есть другой драйвер? Этот, кроме сабжа, еще и сообщение не умеет нормальное отправить (http://pda.delphimaster.net/?id=1268895548&n=0).

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