_3m 4 5 марта, 2009 Опубликовано 5 марта, 2009 (изменено) · Жалоба Проведено множество экспериментов и доработка устройства. Сбои не удалось устранить. Не удивительно, я подозреваю что разработчики усб интерфейса предусмотрели абсолютно все чтобы даже самый упорный разработчик не смог обеспечить его долговременную бесперебойную работу. Задачу решил следующим образом. Отлавливаю возникновение сбоев и программно с помощью SetupAPI отключаю и включаю устройство. Как советовали. Если интересно - могу код приаттачить. Интересно. Собственно я тоже отключаю и включаю с помощья setup api, но у меня hid устройство. Как вы обнаруживаете факт сбоя? И самое главное: удалось ли вам обнаружить и обойти сбой, возникший в процессе енумерации. Мне это не удалось. Изменено 5 марта, 2009 пользователем _3m Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 5 марта, 2009 Опубликовано 5 марта, 2009 · Жалоба Что-то заглох топик... Я на досуге попробовал в линуксе хабом управлять. Получается. Но только из под рута. Или разрешить нужно. Но у меня почему-то хаб только на запросы определённые классом правильно реагирует, а на стандартные как-то странно себя ведёт. Хотя м.б. я ещё не разобрался. Разберусь получше, тогда отпишусь. Проведено множество экспериментов и доработка устройства. Сбои не удалось устранить. Это было прогнозируемо. Задачу решил следующим образом. Отлавливаю возникновение сбоев и программно с помощью SetupAPI отключаю и включаю устройство. Как советовали. Если интересно - могу код приаттачить. Мне интересно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koluna 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба Привожу свой код функции (работоспособный), которая выключает/включает устройство по коду экземпляра устройства. Критика и полезные советы очень приветствуются. Хотелось бы в результате обсуждения получить не только работоспособный, но и простой, красивый и оптимизированный код function On_Off_Device(PnPID: PAnsiChar; State: Boolean): Boolean; var DeviceInfoSet_ : HDEVINFO; // Хендл набора информации об устройствах. DeviceInfoData_ : TSPDevInfoData; // Структура информации об устройстве. SPPropChangeParams_ : TSPPropChangeParams; begin DeviceInfoSet_ := nil; // Получение хендла набора информации об устройстве по коду экземпляра устройства. DeviceInfoSet_ := SetupDiGetClassDevs(nil, PnPID, 0, DIGCF_ALLCLASSES or DIGCF_DEVICEINTERFACE); if Integer(DeviceInfoSet_) = INVALID_HANDLE_VALUE then begin // Ошибка. Result := False; Exit; end else begin // Хендл набора информации об устройстве получен. FillChar(DeviceInfoData_, SizeOf(TSPDevInfoData), 0); DeviceInfoData_.cbSize := SizeOf(TSPDevInfoData); // Заполнение структуры информации об устройстве. if not SetupDiEnumDeviceInfo(DeviceInfoSet_, 0, DeviceInfoData_) then begin // Ошибка. SetupDiDestroyDeviceInfoList(DeviceInfoSet_); Result := False; Exit; end; // Установка полей структуры SPPropChangeParams_.ClassInstallHeader.cbSize := SizeOf(TSPClassInstallHeader); SPPropChangeParams_.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE; SPPropChangeParams_.Scope := DICS_FLAG_GLOBAL; if State then SPPropChangeParams_.StateChange := DICS_ENABLE else SPPropChangeParams_.StateChange := DICS_DISABLE; // Изменение состояния устройства. if not SetupDiSetClassInstallParams(DeviceInfoSet_, @DeviceInfoData_, @SPPropChangeParams_, SizeOf(TSPPropChangeParams)) then begin // Ошибка. SetupDiDestroyDeviceInfoList(DeviceInfoSet_); Result := False; Exit; end; // Подтверждение изменения состояния устройства // (повторный вызов функции SetupDiSetClassInstallParams). if not SetupDiSetClassInstallParams(DeviceInfoSet_, @DeviceInfoData_, @SPPropChangeParams_, SizeOf(TSPPropChangeParams)) then begin // Ошибка. SetupDiDestroyDeviceInfoList(DeviceInfoSet_); Result := False; Exit; end; // Вызов установщика классов. if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DeviceInfoSet_, @DeviceInfoData_) then begin // Ошибка. SetupDiDestroyDeviceInfoList(DeviceInfoSet_); Result := False; Exit; end; end; // Integer(DeviceInfoSet_) <> INVALID_HANDLE_VALUE Result := True; // Освобождение хендла набора информации об устройствах. SetupDiDestroyDeviceInfoList(DeviceInfoSet_); end; Попутно - несколько вопросов. 1. При вызове моей функции с параметром False для отключении устройства N раз подряд, чтобы включить устройство приходится вызывать эту функцию с параметром True тоже N раз подряд. Как будто где-то есть счётчик включения/выключения... Почему и зачем? 2. Хотелось бы прояснить работу SetupDiGetClassDevs. Без флага DIGCF_DEVICEINTERFACE - моя функция не работает. Хотя в других примерах видел вызывы и без этого флага (с параметром Enumerator!). Не понятна связь между параметром Enumerator и флагом DIGCF_DEVICEINTERFACE. 3. Хотелось бы знать как можно назвать по-русски следующие структуры, используемые при вызове функций: HDEVINFO (хендл на структуру ...), TSPDevInfoData (структура ...), TSPPropChangeParams (структура...). Не могу перевести нормально, а название поиметь хочется Как вы обнаруживаете факт сбоя? Функции записи/чтения D2XX возвращают FT_IO_ERROR = 4. Далее при открытии функция открытия возвращает FT_INVALID_HANDLE = 1 (хендл был предварительно успешно закрыт). На основании этого делаю вывод: сбой. И программно переподключаю устройство. Пока только так. К сожалению, не совсем понятно поведение функций D2XX при возникновении разного рода ошибок... Буду рад, если кто-то предложит что-то другое. Давайте думать и обсуждать :) И самое главное: удалось ли вам обнаружить и обойти сбой, возникший в процессе енумерации. Мне это не удалось. У меня таких сбоев пока не было :) Не знаю как это проявляется... Пока сбои при передёргивании любой сетевой вилки или без этого... Они возникают в период 1-2 секунды после момента подключения устройства? А если попробовать его сразу отключать и включать при старте приложения? Написал ещё функцию, которая позволяет узнать подключено устройство к ПК или нет, включено оно или выключено. Позже выложу. Может, напишу ещё функцию поиска какую-нибудь... а то как видно из последующего моего топика (http://electronix.ru/forum/index.php?showtopic=59971) - у FTDI с возвращением информации об устройстве проблемы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Walker2k 0 17 апреля, 2009 Опубликовано 17 апреля, 2009 · Жалоба мучился с фтди тоже порядочно была проблема с режимом суспенд, из-за которого все и подвисало надо аппаратно детектить команду суспенда и выключать все потребители на это время точно уже не помню, но в стандарте усб все параметры описаны Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koluna 0 17 апреля, 2009 Опубликовано 17 апреля, 2009 · Жалоба мучился с фтди тоже порядочно была проблема с режимом суспенд, из-за которого все и подвисало надо аппаратно детектить команду суспенда и выключать все потребители на это время точно уже не помню, но в стандарте усб все параметры описаны А откуда она берётся эта команда суспенда во время обмена информацией? Ну выключил, а дальше что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Walker2k 0 17 апреля, 2009 Опубликовано 17 апреля, 2009 · Жалоба да по стандарту все усб 1.0 хост периодически шлет эту команду по шине усб, по протоколу все устройства должны замереть и ограничить потребление, уже не помню, вроде 500 мка там линии Д+ и Д- в какое-то свое состояние встают, жесткая логика это детектит и питание схемы отрубает, пока линии из этой позы не выйдут а проявлялось на устройстве с фтди так, все нормально отрабатывалось - данные передавались без проблем, пока не наступала пауза в передаче данных, после этого устройство подвисало, программно не ресетилось и вывести его было можно лишь передернув усб кабель из компа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 17 апреля, 2009 Опубликовано 17 апреля, 2009 · Жалоба А откуда она берётся эта команда суспенда во время обмена информацией? Ну выключил, а дальше что? Да нет такой команды! Что за чушь тут пишут? Не верьте. Прочтите стандарт USB. А дальше можно поступать так, как я советовал: http://electronix.ru/forum/index.php?showtopic=60155 Т.е. перетыкать USB шнур програмно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Walker2k 0 21 апреля, 2009 Опубликовано 21 апреля, 2009 (изменено) · Жалоба n_bogoyavlensky обрабатываете ли вы сигнал PWREN# с 12 ноги микросхемы FT245R ? при состоянии PWREN# = 1, ваше устройство должно потреблять не более 500мкА PS. командой перехода в состояние суспенд для низкоскоростных устройств является удержание в течении более 3мс линий D+ в 0, D- в 1. Изменено 21 апреля, 2009 пользователем Walker2k Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 21 апреля, 2009 Опубликовано 21 апреля, 2009 · Жалоба PS. командой перехода в состояние суспенд для низкоскоростных устройств является удержание в течении более 3мс линий D+ в 0, D- в 1. А причём здесь низкоскоростные устройства? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться