Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Железо. Написание драйверов
Перезагрузить страницу Обработка ошибок при работе с USB
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Баданов Александр Баданов Александр вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.07.2004
По умолчанию Обработка ошибок при работе с USB - 08.07.2005, 11:48

Подскажите, пожалуйста, решение следущей проблемы:
При работе с устройством USB Communication class (используется стандартный драйвер usbser). При возникновении ошибки при обмене (внешние помехи), устройство входит в состояние SUSPEND. Компьютер продолжает видеть устройство (как COM порт), но работа с ним не возможна. При попытке открыть его CreateFile возвращает ошибку GetLastError = 31 (Присоединенное к системе устройство не работает). Если порт был уже открыт, то перестают проходить запросы на чтение/запись.
Как можно программно вывести устройство из этого состояния?

Спасибо за ответы.
Ответить с цитированием
  (#2 (permalink)) Старый
EnTech EnTech вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2005
По умолчанию Re: Обработка ошибок при работе с USB? - 12.07.2005, 11:38

Можно попробовать сделать Disable/Enable для этого устройства.
Пример есть в DDK.
Ответить с цитированием
  (#3 (permalink)) Старый
Баданов Александр Баданов Александр вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.07.2004
По умолчанию Спасибо. - 12.07.2005, 15:53

Я уже разобрался. В DDK (win2000), кроме программы Disabler без исходных текстов ничего не нашел, но по в cfgmgr32 нашел функции CM_Enable_DevNode и CM_Disable_DevNode, которые решают мою проблему. Однако если устройство подключается к компьютеру через HUB, то DISABLE/ENABLE приходится делать не самому устройству а HUB-у.
Однако остаются вопросы как отловить переход драйвера в это подвисшее состояние? А то вроде бы устройство открывается нормально, а доступа к нему нет. Функция CM_Get_DevNode_Status то же говорит, что все OK.
Ответить с цитированием
  (#4 (permalink)) Старый
EnTech EnTech вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2005
По умолчанию Re: Спасибо. - 12.07.2005, 19:43

Цитата:
Originally posted by Баданов Александр+-->
Цитата:
Я уже разобрался. В DDK (win2000), кроме программы Disabler без исходных текстов ничего не нашел,
ddk2000srcgeneralsetupenable - все с исходниками.

<!--QuoteBegin-Баданов Александр

[b]Однако остаются вопросы как отловить переход драйвера в это подвисшее состояние?говорит, что все OK.
Думаю, поскольку драйвер чужой, то никак - только поллинг по таймеру.
Ответить с цитированием
  (#5 (permalink)) Старый
Баданов Александр Баданов Александр вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.07.2004
По умолчанию А что можно контроллировать по таймеру? - 13.07.2005, 14:18

А что можно контроллировать по таймеру?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
EnTech EnTech вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2005
По умолчанию Re: А что можно контроллировать по таймеру? - 13.07.2005, 15:48

Да ну хосподи - все, что угодно. Например, выдавать в драйвер какой-нибудь незначащий запрос, что бы убедиться, что девайс жив.
Ответить с цитированием
  (#7 (permalink)) Старый
Баданов Александр Баданов Александр вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.07.2004
По умолчанию 13.07.2005, 16:19

Это понятно, я надеялся что можно все таки как то определить, что драйвер висит толи в SUSPEND толи в HALT.
Ответить с цитированием
  (#8 (permalink)) Старый
EnTech EnTech вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2005
По умолчанию 13.07.2005, 17:53

Ну разве что поставить callback на WM_DEVICECHANGE и посмотреть, что происходит с девайсом.
Ответить с цитированием
  (#9 (permalink)) Старый
Баданов Александр Баданов Александр вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.07.2004
По умолчанию 14.07.2005, 09:28

WM_DEVICECHANGE в такой ситуации не приходит.
Ответить с цитированием
  (#10 (permalink)) Старый
EnTech EnTech вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2005
По умолчанию 14.07.2005, 17:56

Цитата:
Originally posted by Баданов Александр
[b]WM_DEVICECHANGE в такой ситуации не приходит.
Это проверено, или просто идея? Если проверено - тогда в морг

Конечно, если девайс переходит именно в состояние SUSPEND (в чем я сильно сомневаюсь), то можно поставить фильтр и отловить соответствующий IRP. Но, повторяю, скорее всего девайс просто входит в некое ошибочное неопределенное состояние, о чем драйвер не имеет никакой информации.
Ответить с цитированием
  (#11 (permalink)) Старый
Баданов Александр Баданов Александр вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.07.2004
По умолчанию 15.07.2005, 15:04

Device входит в Suspend. По крайней мере в device устанавливаются соответсвующие флаги. В какое состояние входит драйвер - без понятия. Сообщение не приходит - проверено. А установить фильтр, это имеется ввиду написать драйвер фильтр? Или можно все таки обойтись без драйвера?
Ответить с цитированием
  (#12 (permalink)) Старый
EnTech EnTech вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 12.07.2005
По умолчанию 16.07.2005, 12:21

Думаю, "малой кровью" здесь не обойтись. Надо точно знать, в каком состоянии драйвер и как заставить его переинициализировать устройство. Можно пошпионить каким-нибудь IRP-трекером, поизучать IOCTL'и для usbser (они имхо документированы).
Фильтр - это наиболее "мощное" оружие, так сказать "последняя надежда"
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
куча ошибок дина Любые вопросы от новичков 1 04.08.2011 13:34
Обработка ошибок Ahinar OpenGL 21 23.10.2009 12:39
обработка ошибок при конвертировании типов rtttv Visual Basic 5 17.11.2006 14:11
Обработка ошибок компилятором как их исправить mmmaxxx Delphi 2 25.07.2006 20:26
Обработка ошибок для базы данных Z79 Delphi 10 05.08.2005 13:26
Обработка ошибок в хранимой процедуре Dian MSSQL Server 0 22.04.2005 07:43
Обработка ошибок Diver PHP 1 28.02.2005 00:10
Обработчик ошибок для ADO Skiff C++ Builder 0 12.01.2005 17:26
Использование ODBC и обработка ошибок gorick Visual C++ 0 14.04.2004 15:52
Перенапрвление ошибок и сообщений. Anonymous PHP 3 02.09.2003 20:32
FieldByName обработка ошибок Вячеслав C++ Builder 1 06.11.2002 13:16



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов