09.02.2021, 09:42
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 553
Сказал спасибо: 38
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
STM32_HID Windows 10 Low Speed
Здравствуйте.
Есть устройство на STM32. Реализовал на нем CustomHID.
Требуется получать данные с датчиков не менее чем 200 раз в секунду.
Размер пакета 32 байта, В дескрипторе прописал максимальный размер отправляемого пакета тоже 32.
Интервал опроса в дескрипторе также указал 2 то есть каждые 2 мс.
каждый 4 мс выполняю опрос датчиков по спи и отправку пакета на комп:
Код:
|
while (1) {
HAL_Delay(4);
// опрос датчиков
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, dataToSend, USBD_CUSTOMHID_OUTREPORT_BUF_SIZE);
} |
Со стороны компа запускаю поток с чтением порта через стандартные функции WinApi
Код:
|
while (!StopProces)
{
Thread.Sleep(2);
if (WinApi.ReadReport(device, data, DevCapatibylity, ref readed))
{
// разбор пакета и вывод в блоки
}
} |
На Windows7 все работает как часы. Стабильно 200 пакетов в сек я получают.
Но на Windows 10 все по какой то причине начинает тормозить и комп регистрирует всего 60 пакетов в секунду. Уже отключали всякие спящие режимы, экономии энергии.. но это как пляски с бубном. В каких то случаях непонятные действия дают успешный исход и получаем нужные 200 пакетов, в других случаях ничего не выходит и стабильно всегда не более 60.
В чем может быть проблема?? Может где то в дескрипторе нужно прописать что устройство требует максимальной скорости или какая нибудь компонента винды тупит. Подскажите если кто знает куда копать?? Что может быть не так то??
Код:
|
/* USB CUSTOM_HID device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
0x09, /* bLength: Configuration Descriptor size */
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
USB_CUSTOM_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: Configuration value*/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xC0, /*bmAttributes: bus powered */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
/************** Descriptor of CUSTOM HID interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
0x02, /*bNumEndpoints*/
0x03, /*bInterfaceClass: CUSTOM_HID*/
0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of CUSTOM_HID *************************/
/* 18 */
0x09, /*bLength: CUSTOM_HID Descriptor size*/
CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: CUSTOM_HID*/
0x11, /*bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of CUSTOM_HID class descriptors to follow*/
0x22, /*bDescriptorType*/
USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Custom HID endpoints ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
CUSTOM_HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
CUSTOM_HID_EPIN_SIZE, /*wMaxPacketSize: 32 Byte max */
0x00,
0x02, /*bInterval: Polling Interval (2 ms)*/
/* 34 */
0x07, /* bLength: Endpoint Descriptor size */
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */
CUSTOM_HID_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address (OUT)*/
0x03, /* bmAttributes: Interrupt endpoint */
CUSTOM_HID_EPOUT_SIZE, /* wMaxPacketSize: 32 Bytes max */
0x00,
0x02, /* bInterval: Polling Interval (2 ms) */
/* 41 */
} ; |
Дескриптор отчетов взял с какого то официального примера возможно что и в нем что то не так, но собрать свой дескриптор под работу с простым буфером в 32 байта я не сумел. (((
К тому же с этим дескриптором на версиях младше 10 все успешно функционирует.
Код:
|
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */
0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Vendor Usage 1)
// System Parameters
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x1F, // REPORT_COUNT (63)
0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)
0x85, 0x02, // REPORT_ID (4)
0x09, 0x02, // USAGE (Vendor Usage 4)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x1F, // REPORT_COUNT (63)
0x81, 0x82, // INPUT (Data,Var,Abs,Vol)
/* USER CODE END 0 */
0xC0 /* END_COLLECTION */
}; |
|
|
|
|
09.02.2021, 10:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,719
Сказал спасибо: 130
Сказали Спасибо 1,108 раз(а) в 527 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
Вопросы:
1) Откуда брался код для исходника? Откуда взяты драйвера для CUSTOM_HID. Они точно без странностей?
2) Попробуй сменить VID PID. Возможно в W10 произошло наложение адресов на существующее в его базе.
3) Ради интереса попробуй сменить комп. Часто на "замусоренном" компе наблюдаются очень странные эффекты. Данный эффект наблюдается только на этом компе или проблема системная?
4) Ради интереса попробуйте проставить сканнер USB (программный) и попробовать отследить место возникновения проблемы.
|
|
|
|
09.02.2021, 10:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
Ну если 200 раз в сек, то интервал опроса должен быть 5, а не 2.
У вас 2 конечные точки: IN и OUT. Возможно, что 1 из них тормозит вторую?
Не знаю, как реализован протокол USB в STM32, но задержек в отправке быть не должно.
Если пришёл запрос данных от хоста к конкретной конечной точке, МК должен их сразу же отдать, иначе на стороне компа будет ожидание.
У вас один FEATURE репорт - зачем вам использовать REPORT_ID.
Тем более, REPORT_ID для входных и выходных точек.
Да и поле INTERVAL не задаёт частоту опроса, а лишь информирует о максимальной задержке (для INTERRUPT ENDPOINT).
Последний раз редактировалось Godzilla82; 09.02.2021 в 10:38.
|
|
|
|
09.02.2021, 11:19
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 553
Сказал спасибо: 38
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
Сообщение от DanilinSA
|
Вопросы:
1) Откуда брался код для исходника? Откуда взяты драйвера для CUSTOM_HID. Они точно без странностей?
|
Драйвера стандартные в винде. Код исходника сам писал.
Сообщение от DanilinSA
|
Вопросы:
2) Попробуй сменить VID PID. Возможно в W10 произошло наложение адресов на существующее в его базе.
|
Так компы то чистые.
Сообщение от DanilinSA
|
Вопросы:
3) Ради интереса попробуй сменить комп. Часто на "замусоренном" компе наблюдаются очень странные эффекты. Данный эффект наблюдается только на этом компе или проблема системная?
|
Меняли. 7 - стабильно, 10 - кривая.
Сообщение от DanilinSA
|
Вопросы:
4) Ради интереса попробуйте проставить сканнер USB (программный) и попробовать отследить место возникновения проблемы.
|
Попробуем.
Сообщение от Godzilla82
|
Ну если 200 раз в сек, то интервал опроса должен быть 5, а не 2.
|
Хм.. верно ..
Сообщение от Godzilla82
|
У вас 2 конечные точки: IN и OUT. Возможно, что 1 из них тормозит вторую?
Не знаю, как реализован протокол USB в STM32, но задержек в отправке быть не должно.
Если пришёл запрос данных от хоста к конкретной конечной точке, МК должен их сразу же отдать, иначе на стороне компа будет ожидание.
|
Да вроде у чипа свой генератор частоты. Почему проблема не возникает на семерке?? Там данных то очень мало опрос быстрый.
С задержками попробую поиграть..
Сообщение от Godzilla82
|
У вас один FEATURE репорт - зачем вам использовать REPORT_ID.
Тем более, REPORT_ID для входных и выходных точек.
Да и поле INTERVAL не задаёт частоту опроса, а лишь информирует о максимальной задержке (для INTERRUPT ENDPOINT).
|
Без идентификаторов пакеты не принимаются и не отправляются. Возможно что надо пересобрать дескриптор но я написал что не удалось. КОвырял по всякому и в итоге выбрал то что точно работает. Если подкинете готовый рабочий дескриптор для приема передачи пакета в 32 байта буду благодарен.
|
|
|
|
09.02.2021, 11:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
А вам надо и на приём 32 байта и на передачу 32 байта?
Запрос-ответ не интересует? Чисто обмен FEATURE репортами.
|
|
|
|
09.02.2021, 11:32
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 553
Сказал спасибо: 38
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
Сообщение от Godzilla82
|
А вам надо и на приём 32 байта и на передачу 32 байта?
Запрос-ответ не интересует? Чисто обмен FEATURE репортами.
|
Основная работа это передача данных на комп. Периодически комп может передать управляющий запрос для включения некоторого оборудования. Или подстройки некоторых регистров.
|
|
|
|
09.02.2021, 11:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
когда есть IN и/или OUT - это означает, что каждый раз (каждую миллисекунду зависит от INTERVAL) передаётся пакет. И его на стороне контроллера надо передать и/или принять.
Вам нужно передавать от компа также 32 байта, или достаточно 8?
|
|
|
|
09.02.2021, 11:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,363
Сказал спасибо: 85
Сказали Спасибо 621 раз(а) в 376 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
Возможная проблема в том, что "Thread.Sleep(2);" в винде будет давать задержку от 0 до 30 мс. Раз на раз не будет приходиться. Sleep имеет смысл использовать при задержках от 20 и выше мс. Там дикая погрешность, миллисекунд 20. В подзадаче делайте свою задержку. Или просто читайте данные без задержки. В этом случае, насколько помню может быть синхронное чтение (поток будет ожидать поступление данных) или асинхронное, с выдачей кода ошибки.
|
|
|
|
09.02.2021, 12:32
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 553
Сказал спасибо: 38
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
Сообщение от Godzilla82
|
когда есть IN и/или OUT - это означает, что каждый раз (каждую миллисекунду зависит от INTERVAL) передаётся пакет. И его на стороне контроллера надо передать и/или принять.
Вам нужно передавать от компа также 32 байта, или достаточно 8?
|
Ну на будущее мало ли нужно будет 32.. чтобы в МК буферы особо не менять.
Сообщение от pambaru
|
Возможная проблема в том, что "Thread.Sleep(2);" в винде будет давать задержку от 0 до 30 мс. Раз на раз не будет приходиться. Sleep имеет смысл использовать при задержках от 20 и выше мс. Там дикая погрешность, миллисекунд 20. В подзадаче делайте свою задержку. Или просто читайте данные без задержки. В этом случае, насколько помню может быть синхронное чтение (поток будет ожидать поступление данных) или асинхронное, с выдачей кода ошибки.
|
У меня синхронное чтение. Но мне желательно чтобы данные шли с максимально стабильным интервалом. А то если там будут пляски от 100 фпс до 300 тоже не совсем хорошо.
|
|
|
|
09.02.2021, 13:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,363
Сказал спасибо: 85
Сказали Спасибо 621 раз(а) в 376 сообщении(ях)
|
Re: STM32_HID Windows 10 Low Speed
Сообщение от worldmasters
|
У меня синхронное чтение. Но мне желательно чтобы данные шли с максимально стабильным интервалом. А то если там будут пляски от 100 фпс до 300 тоже не совсем хорошо.
|
Тогда Sleep вообще убрать, зачем он там нужен.
И стабильность будет определяться только железом - частотой отправки пакетов.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:13.
|
|