Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
11 / 11 / 1
Регистрация: 10.12.2013
Сообщений: 391

stm32f103c8t6 отправка и получение данных по USB

08.12.2020, 17:26. Показов 8770. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите пожалуйста что-то совсем запутался. есть данный микроконтроллер. хочу принимать и отправлять данные по USB (именно по USB а не виртуальный ком порт). насколько я понял у usb есть 3 режима работы - usb device, hid device и serial device.
я нашел фреймворк и пример https://github.com/Arti3DPlayer/USBDeviceSwift но у меня вообще не получается что либо принять или отправить.
в cubeide -
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
int main(void)
{
  /* USER CODE BEGIN 1 */
 
    uint8_t dataToSend[4] = {0xAA, 0xBB, 0xCC, 0xDD};
 
  /* USER CODE END 1 */
 
  /* MCU Configuration--------------------------------------------------------*/
 
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
 
  /* USER CODE BEGIN Init */
 
  /* USER CODE END Init */
 
  /* Configure the system clock */
  SystemClock_Config();
 
  /* USER CODE BEGIN SysInit */
 
  /* USER CODE END SysInit */
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */
 
  /* USER CODE END 2 */
 
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
      HAL_Delay(1000);
      USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, dataToSend, 4);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
как я понимаю функция USBD_CUSTOM_HID_SendReport отправляет массив байт, но опять же не понятно как их ловить на стороне пк? мне кажется что я заблуждаюсь в чем то
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2020, 17:26
Ответы с готовыми решениями:

Получение и отправка данных через USB Java
Подскажите пожалуйста. Есть либы которые позволяют принимать запросы по USB и отсылать данные?

Отправка и получение SMS через USB-модем
У меня есть USB модем, и есть программа через которую мне можно позвонить, отправить и получить смс через модем. Меня чужая программа не...

Отправка данных USb
Уважаемые все. Такая проблема, необходимо на устройство под android зацепить usb реле mp 709. Интерфейс устройства выдает только...

24
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
08.12.2020, 21:43
В винде для HID есть специальные функции WinAPI или можно использовать библиотеки (например, libhid). Видел когда-то даже программы для работы с HID. В линуксе можно просто читать файл /dev/hidrawX.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
09.12.2020, 01:44
Цитата Сообщение от iopq Посмотреть сообщение
но опять же не понятно как их ловить на стороне пк?
никак
поскольку девайс сам по себе не отправляет данные
ПК, читай хост, посылает запрос к девайсу, и если есть что ответить девайс отсылает, а если нет говорит "нет ничего"
найди книги Агурова и прочитай про USB
0
11 / 11 / 1
Регистрация: 10.12.2013
Сообщений: 391
09.12.2020, 04:11  [ТС]
ValeryS, странно. почему то у меня отправляется кодом выше
Миниатюры
stm32f103c8t6 отправка и получение данных по USB  
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
09.12.2020, 08:53
Цитата Сообщение от iopq Посмотреть сообщение
насколько я понял у usb есть 3 режима работы - usb device, hid device и serial device.
Это не так.
usb device это вообще любое usb-устройство
hid device это специальная разновидность низкоскоростного usb, заточенная под стандартные периферийные устройства взаимодействия с человеком вроде мышек или джойстиков. Хотя если почитать документацию, чего там только нет.
serial device это другая разновидность - эмулятор COM-порта.
Помимо этого распространены:
audio device - микрофоны, наушники.
mass storage device - накопители: флешки, жесткие диски
Все эти устройства используют более или менее стандартные способы работы, встроенные в операционную систему. Но часто производители изобретают собственные протоколы обмена, работающие только с их фирменными драйверами. И вот тогда за usb-устройством может скрываться что угодно - сетевая карта, телефон, турель, камень, логический анализатор, программатор или все это вместе.
Цитата Сообщение от iopq Посмотреть сообщение
как я понимаю функция USBD_CUSTOM_HID_SendReport отправляет массив байт, но опять же не понятно как их ловить на стороне пк? мне кажется что я заблуждаюсь в чем то
Есть библиотека hidapi-hidraw, вроде бы даже кроссплатформенная.
Есть низкоуровневая libusb. Там обмен в обе стороны идет через функции usb_control_msg, как бы странно это не казалось.
Для винды есть свой странный способ.
Если вдруг возникнет желание, можете покопаться в моем говнокоде: https://github.com/COKPOWEHEU/... src/vhid.c
1
Эксперт по электронике
6808 / 3233 / 337
Регистрация: 28.10.2011
Сообщений: 12,626
Записей в блоге: 7
09.12.2020, 17:05
Цитата Сообщение от iopq Посмотреть сообщение
хочу принимать и отправлять данные по USB
Посмотрите архив HID_DevIO.zip Цели применения и отличия разных микроконтроллеров

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Для винды есть свой странный способ.
Это вы про реализацию HID или про winusb.dll?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
09.12.2020, 17:43
Про HidD_GetManufacturerString и подобные - по моей ссылке есть исходник. К какой библиотеке они относятся уже не помню.
0
Эксперт по электронике
6808 / 3233 / 337
Регистрация: 28.10.2011
Сообщений: 12,626
Записей в блоге: 7
09.12.2020, 20:21
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Про HidD_GetManufacturerString и подобные
Они же не для обмена данными, а для запроса строкового дескриптора.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
09.12.2020, 20:53
Кажется, вы меня подозреваете в чем-то нехорошем. Например, в том, что я считаю виндовый подход неправильным или что я к нему предвзято отношусь.
0
11 / 11 / 1
Регистрация: 10.12.2013
Сообщений: 391
09.12.2020, 21:00  [ТС]
и так что я выяснил. если сконфигурировать в кубе как Human interface device class (HID) и -
C++
1
2
3
4
5
6
7
  uint8_t dataToSend[4] = {0x00, 0x00, 0x00, 0x00};
  while (1)
  {
      HAL_Delay(1000);
      USBD_HID_SendReport(&hUsbDeviceFS, dataToSend, 4);
 
 }
то stm32 представляется мышкой и мне удается получить 4 байта на стороне пк.

если сконфигурировать в кубе как Custom Human interface device class (HID), вставить вот такой дескриптор -
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
 /* USER CODE BEGIN 0 */
 
0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)
 
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
 
    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, 0x01,                    //   REPORT_COUNT (1)
 
    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 (2)
 
    0x09, 0x02,                    //   USAGE (Vendor Usage 2)
 
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
 
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
 
    0x75, 0x08,                    //   REPORT_SIZE (8)
 
    0x95, 0x01,                    //   REPORT_COUNT (1)
 
    0xB1, 0x82,                    //   FEATURE (Data,Var,Abs,Vol)
 
    0x85, 0x02,                    //   REPORT_ID (2)
 
    0x09, 0x02,                    //   USAGE (Vendor Usage 2)
 
    0x91, 0x82,                    //   OUTPUT (Data,Var,Abs,Vol)
 
 
 
    0x85, 0x03,                    //   REPORT_ID (3)
 
    0x09, 0x03,                    //   USAGE (Vendor Usage 3)
 
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
 
    0x25, 0x01,                                      //   LOGICAL_MAXIMUM (255)
 
    0x75, 0x08,                    //   REPORT_SIZE (8)
 
    0x95, 0x01,                    //   REPORT_COUNT (1)
 
    0xB1, 0x82,                    //   FEATURE (Data,Var,Abs,Vol)
 
    0x85, 0x03,                    //   REPORT_ID (3)
 
    0x09, 0x03,                    //   USAGE (Vendor Usage 3)
 
    0x91, 0x82,                    //   OUTPUT (Data,Var,Abs,Vol)
 
 
 
    0x85, 0x04,                    //   REPORT_ID (4)
 
    0x09, 0x04,                    //   USAGE (Vendor Usage 4)
 
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
 
    0x25, 0x01,                                      //   LOGICAL_MAXIMUM (255)
 
    0x75, 0x08,                    //   REPORT_SIZE (8)
 
    0x95, 0x01,                    //   REPORT_COUNT (1)
 
    0xB1, 0x82,                    //   FEATURE (Data,Var,Abs,Vol)
 
    0x85, 0x04,                    //   REPORT_ID (4)
 
    0x09, 0x04,                    //   USAGE (Vendor Usage 4)
 
    0x91, 0x82,                    //   OUTPUT (Data,Var,Abs,Vol)
 
 
 
    0x85, 0x05,                    //   REPORT_ID (5)
 
    0x09, 0x05,                    //   USAGE (Vendor Usage 5)
 
    0x75, 0x08,                    //   REPORT_SIZE (8)
 
    0x95, 0x04,                    //   REPORT_COUNT (4)
 
    0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
 
 
 
    0x85, 0x06,                    //   REPORT_ID (6)
 
    0x09, 0x06,                    //   USAGE (Vendor Usage 6)
 
    0x75, 0x08,                    //   REPORT_SIZE (8)
 
    0x95, 0x04,                    //   REPORT_COUNT (4)
 
    0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
 
  /* USER CODE END 0 */
 
  0xC0    /*     END_COLLECTION                     */
то на пк удается обнаружить это устройство, (без дескриптора не работает, он найден в интернете) однако если попробовать отправить что нибудь -
C++
1
2
3
4
5
6
uint8_t dataToSend[5] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE};
  while (1)
  {
    USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, dataToSend, 5);
    HAL_Delay(1000);
  }
то все. никого нет
0
Эксперт по электронике
6808 / 3233 / 337
Регистрация: 28.10.2011
Сообщений: 12,626
Записей в блоге: 7
09.12.2020, 21:10
COKPOWEHEU, я просто пытаюсь понять почему вы считаете в винде работу с HID страной.
Что именно не понравилось в HidD_GetManufacturerString?

iopq, у вас REPORT_ID (1) и другие идентификаторы но при этом вы в нулевом элементе массива указали 0xAA.

Где вы такой HID дескриптор нашли? Я в 6 сообщении дал ссылку на архив. Возьмите оттуда HID дескриптор.
0
11 / 11 / 1
Регистрация: 10.12.2013
Сообщений: 391
09.12.2020, 21:25  [ТС]
locm, спасибо уже лучше. потихоньку и прием появляется и передача. надо с дескрипторами разобраться как следует.

я правильно понимаю что в одной посылке я могу передать максимум 63 байта полезной информации + 1 байт идентификатора? и принять столько же?
0
Эксперт .NET
 Аватар для Rius
13123 / 7684 / 1675
Регистрация: 25.05.2015
Сообщений: 23,454
Записей в блоге: 14
09.12.2020, 22:08
iopq, если ПО верхнего уровня - своё, то можно поверх этих 63+1 байт организовать пакеты произвольной длины.
0
Эксперт по электронике
6808 / 3233 / 337
Регистрация: 28.10.2011
Сообщений: 12,626
Записей в блоге: 7
09.12.2020, 22:09
Идентификатор не обязателен. То есть можно принимать и передавать до 64 байта в посылке. Зависит от информации в описании конечной точки в дескрипторе интерфейса и параметров в HID дескрипторе.

Цитата Сообщение от Rius Посмотреть сообщение
то можно поверх этих 63+1 байт организовать пакеты произвольной длины.
Все равно в одной посылке будет не больше 64 байта.
0
Эксперт .NET
 Аватар для Rius
13123 / 7684 / 1675
Регистрация: 25.05.2015
Сообщений: 23,454
Записей в блоге: 14
09.12.2020, 22:11
Цитата Сообщение от locm Посмотреть сообщение
Все равно в одной посылке будет не больше 64 байта.
Так я и говорю - поверх. А 64-байтные пакеты лишь как нижний слой.

Я иногда встречаю инфу, что пакеты могут быть задекларированы крупнее и система их якобы сама разбивает и собирает. Вы про такое не слышали случайно?
0
Эксперт по электронике
6808 / 3233 / 337
Регистрация: 28.10.2011
Сообщений: 12,626
Записей в блоге: 7
09.12.2020, 22:18
Цитата Сообщение от Rius Посмотреть сообщение
Вы про такое не слышали случайно?
Не слышал и не пробовал.
Проще информацию упаковывать 64-ех байные пакеты. Тогда нет необходимости искать в посылке начало и конец пакета.
0
87 / 86 / 4
Регистрация: 20.11.2016
Сообщений: 270
09.12.2020, 22:25
неправильно дескриптор составлен, вот впиши в идентификатор репорта нулевой байт своего массива 0xAA,
INPUT- идет к компьютеру, т.е. к хосту, и является для него входным, направления репортов именуются с точки зрения хоста, и поэтому для контроллера, хотя и является выходным, но именуется как INPUT


C
1
2
3
4
5
6
7
8
9
 0x85, 0xAA,                    //   REPORT_ID (AA)
 
    0x09, 0x05,                    //   USAGE (Vendor Usage 5)
 
    0x75, 0x08,                    //   REPORT_SIZE (8)
 
    0x95, 0x04,                    //   REPORT_COUNT (4)
 
    0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
0
Эксперт .NET
 Аватар для Rius
13123 / 7684 / 1675
Регистрация: 25.05.2015
Сообщений: 23,454
Записей в блоге: 14
09.12.2020, 22:34
Например

Отсюда следует, что репорт более 64 байт может передаваться порциями по 64 байта и собираться автоматически. Как бы только это запустить...

Цитата Сообщение от locm Посмотреть сообщение
Тогда нет необходимости искать в посылке начало и конец пакета.
Простите, не понял, о чём тут речь.
0
Эксперт по электронике
6808 / 3233 / 337
Регистрация: 28.10.2011
Сообщений: 12,626
Записей в блоге: 7
10.12.2020, 12:58
Цитата Сообщение от Rius Посмотреть сообщение
Как бы только это запустить
По логике в HID дескрипторе репорта пишите что-то типа
C
1
2
    0x75, 0x08,  // Report_size (8)
    0x95, 128,   // Report_count (128)
А в функциях ReadFile и WriteFile читаете или отправляете массив размером 129 байт.
Цитата Сообщение от Rius Посмотреть сообщение
не понял, о чём тут речь.
Когда данные идут сплошным потоком например как через COM порт, необходимо находить начало и конец пакета данных.
При передаче по USB данные идут пакетами по 64 байта и искать начало и конец пакета не требуется.
0
11 / 11 / 1
Регистрация: 10.12.2013
Сообщений: 391
13.12.2020, 01:40  [ТС]
сейчас у меня вот такой дескриптор -
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
  /* USER CODE BEGIN 0 */
        0x06, 0x00, 0xff,              // USAGE_PAGE (Generic Desktop)
 
                    0x09, 0x01,                    // USAGE (Vendor Usage 1)
 
                    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, 0x01,                    //   REPORT_COUNT (1)
 
                    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, 0x06,                    //   REPORT_ID (6)
 
                    0x09, 0x06,                    //   USAGE (Vendor Usage 6)
 
                    0x75, 0x08,                    //   REPORT_SIZE (8)
 
                    0x95, 0x0B,                    //   REPORT_COUNT (11)
 
                    0x81, 0x82,                    //   INPUT (Data,Var,Abs,Vol)
  /* USER CODE END 0 */
  0xC0    /*     END_COLLECTION              */
скажите пожалуйста я правильно понимаю что 0x95, 0x0B, // REPORT_COUNT (11) вот тут вторым байтом устанавливается количество байт на прием и передачу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.12.2020, 01:40
Помогаю со студенческими работами здесь

Отправка данных с формы и получение данных с базы
Привет, форумчане. Прошу помощи разобраться в некоторых моментах. Есть форма: <form...

Получение отправка данных на сервер
Всем привет, такой вопрос, у меня есть винформы(я мог и другое взять но решил с этим) и это клиент - серверное приложение, а также есть...

Отправка и получение данных ajax
Отправляю данные через ajax $.ajax({ url: '../send.php', type: 'post', data:{ 'Weight': FullWeight, ...

Отправка и получение данных в цикле
Добрый день! Опыта работы с ком портом в С++ QT у меня нет, вот и возникла небольшая проблема. Отправляю в устройство команду и получаю...

Отправка и получение данных с COM-порта
Здравствуйте! Подскажите пожалуйста в чем может быть дело. Пытаюсь отправить данные на ком порт и прочесть. Rx и Tx на порте замкнуты,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru