Итак, опять здравствуйте, коты.
Вкурил я эту тему, так что слушайте да ешьте.
Итак.. Если в созданном нами устройстве несколько конечных точек одного типа (например
2 точки Interrupt OUT), тогда при вызове функции CreateFile система откроет только 2 точки: контрольную (нулевую)
и одну из Interrupt точек. Но.. Из 2-х откроется одна interrupt-точка, адрес которой выше.
Получается, если у нас 2 точки Interrupt OUT (одинаковость направления тоже обязательна)
одна с адресом 0x02 а вторая 0x80, то откроется та, у которой адрес 0x80.
Точка с адресом 0x02 останется недоступной.
Повторюсь, одинаковость направления тоже важна!!!
А не только тип..
Итак, имеем один CONTROL и
несколько!! INTERRUPT OUT
Для того, чтобы в нашем примере открыть все точки как полагается, то предстоит сложная работа/
1.Вызываем функцию DeviceIoControl, проставляем необходимые аргументы.
Тут я буду без подробностей. Только скажу, что обязательно включите в проект 2 хидера,
которые идут с поставкой Windows WDK: <devioctl.h> <Usbscan.h> Пути к ним найдете..)
2. Одним из аргументов этой функции будет ссылка на структуру USBSCAN_PIPE_CONFIGURATION
Из этой структуры выуживаем

параметр NumberOfPipes (это число наших точек). Необязательно,
но интересно, для проверки. Но тут нас интересует второй параметр - ссылка на структуру USBSCAN_PIPE_INFORMATION
3. Из структуры USBSCAN_PIPE_INFORMATION для конкретной системной точки
(параметр PipeInfo[нужный номер] из USBSCAN_PIPE_CONFIGURATION
)удим параметр EndpointAddress.
Это и есть наш системный адрес для контрольной точки.
Внимание, данный адрес не совпадает с тем адресом,
который имеется в микроконтроллере. Таким образом находим адреса для всех контрольных точек.
4.Теперь адрес полученной конечной точки добавляем к пути нашего устройства. Т.е. склеиваем строчки.
Допустим, при первом вызове CreateFile у нас будет путь path.
Тогда, чтобы открыть следующую конечную точку, путь должен быть - path\адрес конт.точки. (через слэш)
Повторяем CreateFile требуемое количество раз (сколько у нас точек) и всё. Теперь можем спокойно обращаться к данным точкам
через ReadFile и WriteFile.
Если количество всех точек по одной (например один контрол, один OUT и один IN) то хватит одного вызова
CreateFile.
И еще по аргументам CreateFile для HID девайсов. Третий аргумент, где пишется иногда FILE_SHARE_READ|FILE_SHARE_WRITE можно поставить ноль.
Флаг OVERLAPPED ставим 0. Иначе WriteFile работать не будет нормально.
Пока всё.
У меня получилось записать данные в МК. Пока проблема только с ReadFile. Он у меня при заходе в функцию
почему то виснет. Кто нибудь знает, отчего так..???
