![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нe удается открыть вирт. ком-порт, работающий через usbser.sys
Kolan © (2010-04-09 10:18:00)Здравствуйте!
Есть железка, которая представляется как USB-функция и реализует ACM совместимый USB CDC профиль (это я написал под диктовку нашего «железячника»).
Для подключение к Винде мы использовали драйвер usbser.sys из Виндоус Икс-Пи (второй сервис пак).
Проблема в том, что при определенных действиях (гарантировано воспроизвести не удаётся, но это происходит при физическом отключении железки от порта) виртуальный ком-порт определяется в системе (виден в списке оборудование), а работать с ним не удается, функция открытия файла завершается с ошибкой «Не удается найти указанный файл.»
Причем дело врядли в конкретной программе, так как доступ к порту в этом случае не может получить ни одна программа вообще (пробовали ZOC и пр.).
Помогает только перетыкание USB в другой порт, при этом появляется ком-порт с другим номером и открытие файла проходит успешно. Если после этого воткнуть USB обратно (туда, где только что не работало), открытие снова работает.
Вопросы: В чем может быть дело? Как это исправить?
Германн (2010-04-10 15:27:00) [21]
> Их нету. Никаких китайских. На железке стоит USB разъем,
> который (простите я дилетант) поддерживается самим процессором.
Нормальные процессоры работают по спецификации USB, а не преобразовывают USB в UART.
> Да че смотреть, я не могу порт открыть. CreateFile завершается
> ошибкой, буд-то я открываю не существующий порт.
Судя по ранее сказанным твоим собственным словам ты пытаешься открыть не несуществующий порт, а занятый порт.
GanibalLector (2010-04-10 15:21:00) [22]
> CreateFile завершается ошибкой
Покажи всю ф-цию. Что в параметрах ? Там же есть флаги OPEN_EXISTING и т.д.
Как работаешь с портом синхронно или асинхронно ?
GanibalLector (2010-04-10 15:16:00) [23]
> Открывается. Дальше — вытащил USB.Закрыл прогу.
Ну, а ты проверяешь результат CloseHandle при закрытии программы ? Там ведь, ты закрываешь порт ?
Повторяю еще раз. Временно выкинь nrCommLib и напиши минимальный пример на API. Тогда все увидишь. И чем больше событий поставишь, тем быстрее разберешься.
Я думаю, что при "вытащил" тебе должно прийти какое-то событие. В ответ на которые ты должен что-то сделать.
Kolan (2010-04-10 15:10:00) [24]
> Давай так. ПК перегрузил, подключил девайс, открываешь порт.
> Так открывается ?
Открывается.
Дальше — вытащил USB.
Закрыл прогу.
Подключил USB.
Открыл прогу.
Шиш, не открывается.
GanibalLector (2010-04-10 15:01:00) [25]Если так уверен в проблеме с usbser.sys. то посмотри на версию. Замени в конце-концов на другую ибо их несколько.
GanibalLector (2010-04-10 14:58:00) [26]
> Да че смотреть, я не могу порт открыть.
Ну так это ж происходит не с первой попытки. А после каких-то действий, судя по описанию.
Давай так. ПК перегрузил, подключил девайс, открываешь порт. Так открывается ?
Kolan (2010-04-10 14:49:00) [27]Да че смотреть, я не могу порт открыть. CreateFile завершается ошибкой, буд-то я открываю не существующий порт.
GanibalLector (2010-04-10 14:46:00) [28]
> Я просто пишу CreateFile и получаю сабж
Я бы поступит так :
- выкинул nrCommLib;
- написал минимальный пример на чистом API, задействовав все маски;
см. SetCommMask с флагами EV_RXCHAR , EV_ERR и не только.
- смотрел что происходит через PortMon
Опять таки не понятно, как ты работаешь с портом. Какие таймауты стоят на чтение ? Что происходит, когда данные не пришли и т.д.
Kolan (2010-04-10 12:09:00) [29]
> Ты же вроде что-то пробовал с 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://www.delphimaster.ru/cgi-bin/forum.pl?id=1268895548&n=0).
Мне пришлось супер удобную штуку заменить на ручной скан портов в цикле, который еще и, по своей сути, не всегда работает.
Anatoly Podgoretsky (2010-04-10 09:56:00) [30]> Германн (10.04.2010 02:15:17) [17]
У нас кроме WinAPI еще есть и Для Начинающих и Прочее, так что в сложных случаях есть куда перемещать.
По преобразователям и по драйверам согласен, типичные китайско/индуские поделки. Но других то нет.
Германн (2010-04-10 02:15:00) [31]В целом я считаю правильным перемещение топика в WinAPI. Но боюсь толку от этого будет немного. Бо тут "непаханное поле".
Идиотские преобразователи USB <--> UART.
Непонятные драйвера к ним.
И плюс дебильная работа с СОМ-портом. Не сочтите за хамство. (с) Jeer
Германн (2010-04-10 02:10:00) [32]
> Дмитрий Белькевич (09.04.10 10:41) [2]
>
> Думаю, что наиболее вероятны глюки в драйвере железяки.
Хоть и возможно, но вряд ли. Заметь что автор использовал драйвер от MS.
Германн (2010-04-10 02:07:00) [33]
> GanibalLector © (10.04.10 00:58) [14]
>
> А смотрел, что вообще происходит с портом ? Есть же PortMon.
> Открой и посмотри. Все сразу ясно станет.
>
> Там ты увидишь, закрывается порт или нет.
>
Уверен что не увидит. Или увидит но не то.
GanibalLector (2010-04-10 00:58:00) [34]А смотрел, что вообще происходит с портом ? Есть же PortMon. Открой и посмотри. Все сразу ясно станет.
Там ты увидишь, закрывается порт или нет.
З.Ы. А вообще, "домашку" пора делать ))
Германн (2010-04-10 00:38:00) [35]
> Kolan © (09.04.10 14:20) [11]
Ты же вроде что-то пробовал с tpapro?
Проверено на возможно похожей железяке (микросхема FT232RL). Tapdcomport проблем не вызывает. В то время как программы (созданные двумя моими знакомыми) читающие/пишущие в СОМ-порт в доппотоках при отключении этой железяки от USB порта обязательно вызывают какой-нибудь кошмар. По-моему было как-то подобное твоему эффекту. Но чаще всего этот эффект затмевается тем, что происходит полное зависание системы, которое снимается только эникеем.
Kolan (2010-04-09 16:35:00) [36]Что-то еще нужно? Исходники nrCommLib есть, если нужно — могу детальнее описать что и как.
Kolan (2010-04-09 14:20:00) [37]Я использую компонент nrCommLib. Он, вроде, использует.
Германн (2010-04-09 14:15:00) [38]
> Kolan © (09.04.10 14:14) [9]
>
> Открываю в начале программы, закрываю в конце.
>
Доппотоки используешь?
Kolan (2010-04-09 14:14:00) [39]Открываю в начале программы, закрываю в конце.
Kolan (2010-04-09 14:13:00) [40]Ну ты попробуй, все-таки.