STM32 VCP - Recibir datos de la PC

Estoy usando el firmware STM32 HAL VCP generado por CubeMX en la placa de descubrimiento STM32F4. El puerto COM virtual funciona, puedo transmitir desde el microcontrolador a la PC tantos mensajes como quiera. Pero en la otra dirección, desde la PC hasta el microcontrolador, solo puedo enviar un mensaje. Si trato de enviar una segunda, static int8_t CDC_Receive_FS (char* Buf, uint32_t *Len)no se llamará a la devolución de llamada y RealTerm se bloquea en la PC. Mi programa cliente también se bloquea cuando intenta escribir en el puerto COM por segunda vez.

En el lado del microcontrolador, eliminé todo mi código CDC_Receive_FS(), actualmente solo regresa USBD_OK. En la función principal solo hay una HAL_Delay()llamada periódica, también intenté eliminar esto, pero no tuvo efecto.

Alguna idea, cual puede ser el problema?

Búfer de recepción completo en algún lugar, quizás, ¿se está activando el protocolo de enlace de hardware o software?
Publiqué la respuesta, debe haber un problema de apretón de manos en el software.

Respuestas (1)

Encontré la respuesta para mi propia pregunta. Hay un ejemplo bien documentado en la siguiente página web: http://visualgdb.com/tutorials/arm/stm32/usb/

En primer lugar, tuve que completar el código generado tal static int8_t CDC_Receive_FS (char* Buf, uint32_t *Len)como está escrito en la fuente anterior.

Después de eso, tuve que crear e implementar la int VCP_read(void *pBuffer, int size)función, tal como está escrito en la fuente mencionada anteriormente.

El punto clave era que tenía que llamar periódicamente a la int VCP_read(void *pBuffer, int size)función para leer del búfer los datos recibidos. Si no llamo a esta función, la PC no puede escribir la próxima vez que el puerto COM.

Gracias por guiarme a la respuesta. Para mí, la clave de esto fue agregar una llamada a 'USBD_CDC_ReceivePacket(&USBD_Device);' dentro de la devolución de llamada de recepción... 'static int8_t CDC_Itf_Receive(uint8_t* Buf, uint32_t *Len)' Parece ser necesario decirle al controlador de la PC host que recibimos el paquete correctamente.