Я думаю должна сработать работа с файлом USB001 или USB002 -...20.06.07 14:47 Число просмотров: 3616 Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
Здравствуйте, все. У меня такая проблема. Нужно обмениваться данными с USB-устройством. Есть ли простые способы для этого (например, как при работе с LPT/COM через CreateFile)?
Пока вижу только такое решение: сканировать шину PCI, потом USB и, наконец (хотя, ИМХО, это только начало...), инициализировать его и обмениваться данными.
А если учесть возможность работы под NT-подобными Виндами, то ещё и драйвер писать придётся чтобы порты открыть. Последнее меня вообще в тоску кидает, т.к. это мне пока ещё не очень по зубам.
Может кто знает способ попроще?
У Агурова в книжке "Практика программирования USB" вычитал,...24.07.07 05:59 Автор: Vedrus <Serokhvostov Anton> Статус: Member
У Агурова в книжке "Практика программирования USB" вычитал, что можно создавать устройства, для которых не понадобится драйверов. Один из таких классов устройств - это CDC. Говорит, что в этом случае обмен данными будет точно такой же, как и с последовательным портом. Посмотрел программу, прилагаемую к дискете. Намёков на USB даже не обнаружил! Обычная программа для обмена данными по COM-порту. Я где-то туплю, или Агуров всех развёл?
Развел. Для USB по любому нужны драйвера24.07.07 11:33 Автор: amirul <Serge> Статус: The Elderman
> У Агурова в книжке "Практика программирования USB" вычитал, > что можно создавать устройства, для которых не понадобится > драйверов. Один из таких классов устройств - это CDC.
А что такое CDC?
> Говорит, что в этом случае обмен данными будет точно такой > же, как и с последовательным портом. Посмотрел программу, > прилагаемую к дискете. Намёков на USB даже не обнаружил! > Обычная программа для обмена данными по COM-порту. Я где-то > туплю, или Агуров всех развёл?
Другое дело, что есть USB класс - последовательный девайс (на нем обычно работают всякие IrDA, дата-кабели к мобилам и пр.). Вот к нему то драйвер обеспечивает доступ как к обычному COM-порту. Проблема только в том, что (насколько я помню) дрова для данного класса не bundle-ятся с WinXP всех сервис паков.
Это коммуникационные устройства и есть.24.07.07 12:00 Автор: Vedrus <Serokhvostov Anton> Статус: Member
Neznaika, спасибо, но я пока морально не готов к разбору с драйверами. Вроде нашёл способ проще, правда не факт, что он работает. В нём используются GUID'ы и функции SetupDiGetInterfaceDeviceDetail, SetupDiDestroyDeviceInfoList и другие похожие, правда в MSDN'е некоторых из них нет. Кто-нибудь в этой стороне на грабли попадал? Буду, признателен, если опытом поделитесь.
PS. Несколько абзацев прочитал. Хорошая статья - на лёгком языке написана. Спасибо.
А стоило дочитать до конца, тогда вопрос бы отпал.25.06.07 11:10 Автор: AlexD <Alexander> Статус: Member
Возникло ещё больше вопросов. Думаю это не та статья, с которой нужно начинать, она вроде рассчитана на продвинутых людей, имеющих опыт в программировании драйверов. Решил разбираться с DDK, открываю новую тему, по поводу: «Как компилировать в DDK?».
Прочитав некоторое число литературы, пришёл к выводу, что «просто» пообщаться с USB устройствами не получится. Если никто не докажет обратного, тему через пару дней закрою.
А чем BuildXxxUrbRequest/IoCallDriver не просто?03.07.07 11:08 Автор: amirul <Serge> Статус: The Elderman
А можно какую-нибудь конкретную функцию из BuildXxxUrbRequest, а то в MSDN'е много чего на слово Build начинается... И что, в этом случае без драйвера можно обойтись? Извиняюсь, если вопросы глупые.
Практически вся работа с USB-устройствами ведется через URB (USB Request Block)03.07.07 13:05 Автор: amirul <Serge> Статус: The Elderman
> А можно какую-нибудь конкретную функцию из > BuildXxxUrbRequest, а то в MSDN'е много чего на слово Build > начинается... И что, в этом случае без драйвера можно > обойтись? Извиняюсь, если вопросы глупые.
Посылается URB через обычный Internal IOCTL IRP с кодом IOCTL_INTERNAL_USB_SUBMIT_URB. Один из самых широко используемых типов URB - это UrbBulkOrInterruptTransfer, его поля можно заполнить при помощи макроса UsbBuildInterruptOrBulkTransferRequest. Пример использования можно найти в том же \src\usb\bulkusb\sys\bulkrwr.c
Хотя для работы с USB надо как минимум сначала выбрать конфигурацию (UrbSelectConfiguration) и только после этого используя один из pipe handle-ов, можно посылать/принимать данные. В общем, если ты ожидал что-то типа UART-а, то придется забыть об этих мечтах.
Подключил к USB флешку, и смотрю пример bulkusb:03.07.07 13:49 Автор: Vedrus <Serokhvostov Anton> Статус: Member
Подключил к USB флешку, и смотрю пример bulkusb:
rwbulk -u выдаёт: Failed to open () = 0DEV not open
rwbulk -w 5 выдаёт
Failed to GetUsbDeviceFileName
Прогонял программу в отладчике и обнаружил, что функция SetupDiEnumDeviceInterfaces возвращает ошибку 0x103 (что означает "Дополнительные данные отсутствуют"). Если просто -w, без 5, то вообще с ошибкой завершается и просит отослать отчёт Microsoft.
Может быть это всё из-за того, что я драйвер установить не смог? rwbulk его автоматически подгружает?
Пробовал следовать инструкциям Readme-файла по установке драйвера, но не получилось. Там говорится, что нужно установить драйвер для нового устройства, а как быть если я работаю с драйвером, у которого устройства нет?
Поможете корректно запустить этот пример?
PS. Трудно быть чайником...
Нет не подгружает.03.07.07 16:02 Автор: amirul <Serge> Статус: The Elderman
> Может быть это всё из-за того, что я драйвер установить не > смог? rwbulk его автоматически подгружает?
Нет не подгружает.
> Пробовал следовать инструкциям Readme-файла по установке > драйвера, но не получилось. Там говорится, что нужно > установить драйвер для нового устройства, а как быть если я > работаю с драйвером, у которого устройства нет?
Я не разбирался с этим примером, но кажется мне, что драйвер надо ставить на то устройство, с которым ты собираешься работать (в твоем случае - флешку). Если будешь делать update driver, то замени vid и pid в inf файле (как написано в readme).
> Поможете корректно запустить этот пример?
Еще один вариант: создать сервис для драйвера самому
sc create bulkusb binPath= "System32\DRIVERS\bulkusb.sys" type= kernel
После этого найти Hardware Device Key нужного устройства в HKLM\System\CCS\Enum\USB\Vid_xxxx&Pid_xxxx\xxxxxx
Узнать можно в Device Manager-е. Открыть properties нужного девайса и во вкладке Details посмотреть Device Instance Id
После того, как нужный ключ найден, разрешить себе доступ на запись в этот ключ (по дефолту запись на все подключи Enum-а - только для юзера SYSTEM) и поменять значение Service с USBSTOR (скорее всего именно такой сервис будет у флешки) на bulkusb. При следующем появлении данного устройства, для него будет загружен драйвер bulkusb и ты сможешь с ним общаться.
> PS. Трудно быть чайником... Ага :-)
Я думаю должна сработать работа с файлом USB001 или USB002 -...20.06.07 14:47 Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman