Приветствую!
Запустил USB класс CDC по этой статье - https://microtechnics.ru/stm32cube-i-usb-virtual-com-port/. Устройство определяется, данные отправляются, все четко. Не могу понять как принимать данные, когда вызывать CDC_Receive_FS()?
CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) - callback функция. т. е. она будет вызвана "автоматически" по приему данных через USB.
Аргументы будут указывать на принятые данные (uint8_t* Buf) и количество принятых байт (uint32_t *Len). Далее уже можно обрабатывать эти данные.
@tech спасибо! вроде понятно, но можно, если не сложно, небольшой примерчик...
@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.
Класс, спасибо! Проверил - все получилось, обработку данных теперь делаю.
@tdg и в CDC_Receive_FS(), как и в любых прерываниях, не стоит выполнять какие-либо длительные операции, все максимально оперативно.