Приветствую!
Запустил 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(), как и в любых прерываниях, не стоит выполнять какие-либо длительные операции, все максимально оперативно.