Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38

USB HID криво определяется и нестабильно

14.03.2017, 12:50. Показов 1063. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь выполнять чиение/запись в USB HID устройство. Прошивку для МК писал сам. МК определяяется но с косяками.
1. Устройство определяется 1 раз из 5. Может с первого раза определиться, а может свалиться в неизвестное устройство. А может определиться но с кодом 10, что запуск устройства невозможен. Грешу на то, что МК при подключении подтягивает линию D+ (если не ошибаюсь) к питанию (ну чтоб ОСь среагировала на подключение устройства). Подтяжка так и остается до отключения устройства. Может надо отключать подтяжку и подключать только на короткий промежуток?

2. Допустим устройство успешно определилось. Могу писать в устройство и считывать из него. И например, на 20+ итерации либо виснет программа, либо виснет вся система - ни мышь. ни клавиатура не работает и лечится только резетом ПК.

так определяю путь к устройству:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
GUID guid;
    LPGUID lpGUID = &guid;
    HidD_GetHidGuid(lpGUID);//получим GUID HID устройства
    SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
    HDEVINFO hDevInfo;
    //hDevInfo  = SetupDiGetClassDevsA(NULL,"USB",0,DIGCF_PRESENT | DIGCF_ALLCLASSES);
    //запрашиваем список устройств с интерфейсом USB_HID используя GUID полученный ранее
    hDevInfo = SetupDiGetClassDevsA(lpGUID,NULL,NULL,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
    if (hDevInfo==INVALID_HANDLE_VALUE)
        {
        //message
        MessageBoxA(hwnd,"Invalid handle","Ошибка",MB_OK);//Выводим Месседж
        }
    else if (hDevInfo!=0)
        {
        DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
        BOOL result;
        result=true;
        DWORD ReqSize;
        SP_DEVINFO_DATA did;
        for (int devIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, devIndex,&DeviceInterfaceData); ++devIndex)
            {
            // получим размер буфера
            result = SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, NULL, 0, &ReqSize, NULL);//сначала вызываем данную функцию с 3 параметром NULL
            //функция вывалится с ошибкой, что неподходящий буфер, едем дальше
            did.cbSize = sizeof (SP_DEVINFO_DATA);
            PSP_INTERFACE_DEVICE_DETAIL_DATA ptrDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) new BYTE [ReqSize];
            ptrDetail->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);
            char*  CMP_BUF=new char[5];//не забыть delete
            GetDlgItemTextA(hwnd, EDIT_3, CMP_BUF, 5);
            
            if (TRUE == SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, ptrDetail, ReqSize, NULL, &did))
                {
                MessageBoxA(hwnd,ptrDetail->DevicePath,"Сообщение",MB_OK);//Выводим Месседж
                //Если строка указанная в editbox есть в пути к устройству, то устройство найдено.
                //
                //
                if (strstr(ptrDetail->DevicePath, CMP_BUF)) //сравниваем есть ли в пути к устройству vid_0483 - это от моего девайса
                    {
                    MessageBoxA(hwnd,"Нашел","Сообщение",MB_OK);//Выводим Месседж
                    memcpy(PATH,ptrDetail->DevicePath, (strlen(ptrDetail->DevicePath)+1));
                    delete []CMP_BUF;
                    delete []ptrDetail;
                    SetupDiDestroyDeviceInfoList(hDevInfo);
                    return 1;
                    }
                }
 
            delete []CMP_BUF;
            delete []ptrDetail;
            }
        SetupDiDestroyDeviceInfoList(hDevInfo);
        }
    return 0;
Так выполняю чтение/запись по нажатию кнопки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case BTNHIDSEND:
                    {
                    static char arr[8] = {REPORT_ID0,0x30,0xAB,0,0,0,0,0}; //можно отправить 6 (1+5)
                    int rxArr[5];
                    DWORD sended;
                    DWORD received;
                    for (int i=1; i<50;i++){
                    if (arr[1]==0x30) arr[1]=0x31;
                    else arr[1]=0x30;
                    WriteFile(hFile2,arr,6,&sended,NULL);
MessageBoxA(hwnd,"HID","Путь",MB_OK);//Выводим Месседж только для того что бы между чтением/записью была задержка
                    ReadFile(hFile2,rxArr,3,&received,NULL);//без "холостого" чтения устройство еще более не стабильно.
//думал может происходит переполнение буфера приемника.
                    }
                    //delete []IN_BUF;
                    break;
                    }
Логика устройства такова, что после получения OUT пакета устройство отправляет IN пакет.

Вот никак не пойму почему все намертво виснет и почему девайс то определяется то нет.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.03.2017, 12:50
Ответы с готовыми решениями:

USB Мышь не определяется HID-совместимое устройство
Вин ХР. УСБ мышь АВТОМАТИЧЕСКИ определяется как HID-совместимое устройство и не работает . Необходимо вручную выставлять что это HID...

HID Class на V-USB (статья USB для AVR. Часть 2.)
Здравствуйте. Решил перейти от библиотеки Libusb на HIDlibrary и как раз нашел эту статью. Но возникли некоторые трудности. Вот теперь и...

USB для AVR. Часть 2. HID Class на V-USB
Прочитал статью &quot;USB для AVR. Часть 2. HID Ctoss на V-USB&quot;, решил собрать все по примеру и все поолучилось. Но прогу для компа взял ту,...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2017, 12:50
Помогаю со студенческими работами здесь

USB-HID библиотека с st.com STM32f105 "Устройство USB не .."
Товарищи. Взял USB библиотеку с st.com (On-The-Go host omd divice library), для STM32F105 connectivity line. Запускаю и &quot;Устройство...

USB 2.0 определяется как USB 3.0, не работает USB-свисток, геймпад не подключается
Не работает беспроводной геймпад speedlink torid sl-6576. Подключаю блютуз свисток к пк, запускаю геймпад, а он не определяется. При...

JF v95c не определяется (или определяется как USB MEMORY BAR)
Недавно столкнулся с такой ситуацией. Подключаю флэху а она не работает... т.е. на win xp определяется как неопознанное устройство. на...

Нестабильно работают USB выходы
Ребята помогите ! У меня мать asus M2A-MX , сначала комп начал долго включатся(минут 5 висел на заставке материнки, потом грузился дальше)...

USB HID
Есть книга Агурова по работе с USB. Но в ней все примеры сос тороны хоста на дельфи. А как вызывать HID функции из hid.dll из билдера?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru