USB VCP-CDC y UART en STM32

1

Generé el código VCP USB para "STM32F103C8T6" con STM32CubeMX. Estoy intentando enviar los datos recibidos por STM desde la PC a una placa Arduino usando UART. El código funciona bien para datos con poco tamaño, pero cuando quiero enviar datos más grandes, los datos recibidos en Arduino están dañados. Estoy usando "Teraterm" y "Realterm" para enviar datos desde la PC a STM32. He modificado el CDC_Receive_FS para 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 velocidad en baudios de USART es 19200, y en STM32, tamaño del búfer recibido, APP_RX_DATA_SIZE se define en 640. ¿Qué debo hacer?

    
pregunta Mehran

2 respuestas

2

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

    
respondido por el Mehran
4

cuando usa uart dma o la versión de interrupción no está bloqueando, la función uart regresa inmediatamente antes de que los datos se envíen completamente Por lo tanto, es posible que se prepare para recibir nuevos datos de usb antes del envío anterior en uart. A medida que use el mismo búfer para usb rx y uart tx, usb comenzará a volver a archivar el búfer, ya que aún se está enviando por uart (por qué se echa de menos).

si usas dma o it, entonces 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 los datos entrantes a medida que se envían.

    
respondido por el Michel Sanches

Lea otras preguntas en las etiquetas