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

Как узнать о том что прием данных по USB окончен?

05.06.2017, 12:41. Показов 3202. Ответов 5

Студворк — интернет-сервис помощи студентам
Имеется контроллер Stm32F107 и давний проект, написанный в Keil V4 задолго до меня.
Прием данных работает, но дело в том, что весь принцип приема основан на том что размер данных не кратен 64.
Т.е. мы получаем пакеты по 64, записываем их в буффер, а как только пришел огрызок пакета не кратный 64, выставляется флаг приема данных и начинается их обработка.
Но когда приходят данные размером, кратным 64, флаг не выставляется и буффер продолжает набиваться уже другими пакетами, пока не придет огрызок.
Вопрос как определить какой длинны данные нам будут слаться по USB или передача уже окончена или сколько пакетов будет передано?
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
/**
  * @brief  VCP_DataRx
  *         Data received over USB OUT endpoint are sent over CDC interface 
  *         through this function.
  *           
  *         @note
  *         This function will block any OUT packet reception on USB endpoint 
  *         untill exiting this function. If you exit this function before transfer
  *         is complete on CDC interface (ie. using DMA controller) it will result 
  *         in receiving more data while previous ones are still not sent.
  *                 
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL
  */
 
 
static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len)
{
        
    if (!vcp_data_received)
    {       
        memcpy((void *)(VCP_Rx_Buf+VCP_Rx_Buf_Len),(void *)Buf,Len);
        VCP_Rx_Buf_Len += Len;
        //здесь ошибка! 
        if (Len != CDC_DATA_MAX_PACKET_SIZE) //CDC_DATA_MAX_PACKET_SIZE=64
        {
                        //когда пришел огрызок, зажигаем диод и выставляем флаг приема
            USB_BKS_LEDOn(LED1);    
            vcp_data_received = 1;
        }
    }
    
    return USBD_OK;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.06.2017, 12:41
Ответы с готовыми решениями:

Как узнать о том, что клиент дисконектнулся от сервера?
Здравствуйте. Делаю сервер. В нем есть подсчет пользователей онлайн. Прибавить пользователя, при подключении к сокету легко, но вот как...

Как узнать о том что разница в парах массива не равна 1
здравствуйте, массив all_fnd = как узнать что в парах и в какой не равна 1? пары 5-6 13-24=вот здесь не равно 1, так как...

Как средствами asp узнать о том, что пользователь укачал файл с сервера
Как средствами asp узнать о том, что пользователь укачал файл с сервера. Очень важный момент: нужен не факт тыкания по ссылке, а факт...

5
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,419
Записей в блоге: 14
05.06.2017, 13:27
VCP - Virtual Com Port?
В протоколе обмена, который передаётся по COM порту, разве нет ничего про размеры пакетов?
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
05.06.2017, 14:57
Цитата Сообщение от Rius Посмотреть сообщение
В протоколе обмена, который передаётся по COM порту, разве нет ничего про размеры пакетов?
8, 16, 32, 64 байта
Когда мне нужно было пару флагов передавать 1 байт, использовал режим 8 байт, 7 байт шли просто в довесок
0
3 / 3 / 1
Регистрация: 18.06.2015
Сообщений: 70
06.06.2017, 11:18  [ТС]
мне тут подсказали, что это usb_cdc, и если пакеты кратны 64, то он в довесок шлет пакет нулевой длины ZLP (zero length packet).
пока поймать его у меня не получается
0
38 / 38 / 11
Регистрация: 27.09.2014
Сообщений: 491
06.06.2017, 12:13
Цитата Сообщение от Fati_ Посмотреть сообщение
Прием данных работает, но дело в том, что весь принцип приема основан на том что размер данных не кратен 64.
Странный какой-то принцип: обычно либо в начале пакета идет длина, либо пакет кратен какому-нибудь числу...
А так с огрызками получается то целый пакет, то огрызок... и ищи потом начало пакета...
В принципе можно по приему первого байта пакета таймер заводить - может такое прокатит...
0
Эксперт .NET
 Аватар для Rius
13118 / 7679 / 1674
Регистрация: 25.05.2015
Сообщений: 23,419
Записей в блоге: 14
06.06.2017, 12:33
Однако, в USB in a NutShell упоминался:
Bulk transfers are only supported by full and high speed devices. For full speed endpoints, the maximum bulk packet size is either 8, 16, 32 or 64 bytes long. For high speed endpoints, the maximum packet size can be up to 512 bytes long. If the data payload falls short of the maximum packet size, it doesn't need to be padded with zeros. A bulk transfer is considered complete when it has transferred the exact amount of data requested, transferred a packet less than the maximum endpoint size, or transferred a zero-length packet.
И на SO проблема всплывала:
Its 64 bytes actually (MaxPacketSize). USB bulk transfers "end" with transfers that are not MaxPacketSize - normally 64 bytes long. If your transfer is an integer multiple of that, you send a zero packet after the data. This signals the transfer end to upper USB software stacks, which will return your data at once.

Most VCP example code omits this for simplicity.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2017, 12:33
Помогаю со студенческими работами здесь

прием данных по usb
недавно в руки попала отладочная плата на stm32l , подскажите пожалуйста, как на компьютер принимать с нее данные? в контроллере отправка...

Прием данных с контроллера по USB
Есть контроллер Arduino, который принимает данные с ик-датчика(mlx90614). Данные раз в секунду выводятся в формате Celcius: 27.20 ...

COM-USB приём, передача данных
Добрый день! Такая проблема: данные с микроконтроллера ATMEGA 128 идут по RS232C после чего попадают в переходник COM-USB, хотелось бы...

Прием данных через USB порт
кто-нить может подсказать компоненты для работы с USB из Delphi, если точнее нужно считывание передаваемых данных

Pic18f4550 USB HID прием данных
Подскажите, пожалуйста, есть ли какой флаг при работе pic18f4550 с usb, сигнализирующий что пришли данные с компа. Вообщем по какому...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru