USB VCP-CDC y UART en STM32

Generé un código USB VCP para "STM32F103C8T6" con STM32CubeMX. Estoy tratando de enviar los datos recibidos por STM desde la PC a una placa Arduino usando UART. El código funciona bien para datos de pequeño tamaño, pero cuando quiero enviar datos más grandes, los datos recibidos en Arduino se corrompen. Estoy usando "Teraterm" y "Realterm" para enviar datos desde la PC a STM32. Modifiqué el CDC_Receive_FSpara enviar datos a través de UART en modo DMA, aquí está el código:

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{

    HAL_UART_Transmit_DMA(&huart3, Buf,(uint16_t)* Len);/* same problem with HAL_UART_Transmit_IT*/ 
    USBD_CDC_ReceivePacket(hUsbDevice_0);//Getting ready for receiving next data
    return (USBD_OK);

}

envié esto

{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 36 37 38 39 40}

y recibido

{1 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 20 21 22 23 24 2}

La tasa de baudios de USART es 19200, y en STM32, el tamaño del búfer recibido APP_RX_DATA_SIZEse define como 640. ¿Qué debo hacer?

Respuestas (2)

cuando usa uart dma o la versión de interrupción, no se bloquea, la función uart regresa de inmediato antes de que los datos se envíen por completo. Entonces, sucede que se prepara para recibir nuevos datos de usb antes de enviarlos previamente en uart. A medida que usa el mismo búfer para usb rx y uart tx, usb comenzará a volver a llenar el búfer, ya que uart todavía lo envía (por qué extraña cosas).

si usa dma o luego maneja la devolución de llamada de finalización para reiniciar la recepción de usb o implementar un fifo/buffer más elaborado entre usb y uart para almacenar en búfer los datos entrantes a medida que se envían.

Tienes razón. Encontré este "HAL_UART_TxCpltCallback" para el final de la transferencia en modo DMA, pero no pude hacerlo funcionar. ¿Tienes alguna sugerencia de cómo modificarlo?
Lo siento, pero no tienen una sola respuesta aquí, puede ser bastante complicado. Depende de usted organizar la suite de su aplicación y sus necesidades.

Usé "HAL_UART_Transmit" para enviar y funciona bien, pero no sé qué está mal con "HAL_UART_Transmit_DMA" y "HAL_UART_Transmit_IT".