Top.Mail.Ru
Уведомления
Очистить все

[Решено] USB CDC - прием данных на STM32.

TDG
 TDG
(@tdg)
New Member

Приветствую!

Запустил USB класс CDC по этой статье - https://microtechnics.ru/stm32cube-i-usb-virtual-com-port/. Устройство определяется, данные отправляются, все четко. Не могу понять как принимать данные, когда вызывать CDC_Receive_FS()?

Цитата
Topic starter Размещено : 04.07.2021 12:40
Тэги темы
tech
 tech
(@tech)
Trusted Member

CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) - callback функция. т. е. она будет вызвана "автоматически" по приему данных через USB.

Аргументы будут указывать на принятые данные (uint8_t* Buf) и количество принятых байт (uint32_t *Len). Далее уже можно обрабатывать эти данные.

ОтветитьЦитата
Размещено : 05.07.2021 12:04
TDG
 TDG
(@tdg)
New Member

@tech спасибо! вроде понятно, но можно, если не сложно, небольшой примерчик...

ОтветитьЦитата
Topic starter Размещено : 06.07.2021 19:12
tech
 tech
(@tech)
Trusted Member
От: @tdg

@tech спасибо! вроде понятно, но можно, если не сложно, небольшой примерчик...

Конечно, не проблема) Набросал небольшой пример:

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  if (rxFlag == 0)
  {
    // Проверяем, что принято не более, чем MAX_SIZE
    if (*Len <= MAX_SIZE)
    {
      if ((Buf[0] == 0x12) && (Buf[1] == 0x23))
      {
	rxFlag = 1;
      }
    }
  }
    
  
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

1. Попали в callback по приему данных.

2. Проверяем кол-во принятых байт. MAX_SIZE - определенное дефайном макс. допустимое кол-во байт.

3. Проверяем значение первых двух принятых байт. Если они верные (0х12, 0х23 в этом примере), то выставляем флаг, что данные приняты.

В общем по такой схеме работаем с принятыми данными в Buf и кол-вом принятых байт в Len.

ОтветитьЦитата
Размещено : 06.07.2021 21:32
TDG
 TDG
(@tdg)
New Member

Класс, спасибо! Проверил - все получилось, обработку данных теперь делаю.

ОтветитьЦитата
Topic starter Размещено : 07.07.2021 15:16
Aveal
(@aveal)
Illustrious Member Admin

@tdg и в CDC_Receive_FS(), как и в любых прерываниях, не стоит выполнять какие-либо длительные операции, все максимально оперативно.

ОтветитьЦитата
Размещено : 07.07.2021 15:42
Поделиться: