USB VCP-CDC и UART на STM32

Я сгенерировал код USB VCP для «STM32F103C8T6» с помощью STM32CubeMX. Я пытаюсь отправить полученные данные с помощью STM с ПК на плату Arduino с помощью UART. Код хорошо работает для данных небольшого размера, но когда я хочу отправить большие данные, полученные данные в Arduino искажаются. Я использую «Тератерм» и «Реалтерм» для отправки данных с ПК на STM32. Я модифицировал CDC_Receive_FSдля отправки данных через UART в режиме DMA, вот код:

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);

}

я отправил это

{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}

и получил

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

Скорость передачи USART составляет 19200 бод, а в STM32 размер полученного буфера APP_RX_DATA_SIZEопределен как 640. Что мне делать?

Ответы (2)

когда вы используете uart dma или версию с прерыванием, она не блокируется, функция uart возвращается сразу же, прежде чем данные будут полностью отправлены. Поскольку вы используете один и тот же буфер для usb rx и uart tx, usb начнет перезаполнять буфер, так как он все еще отправляет uart (почему вы что-то пропускаете).

если использовать dma или его, то обработайте обратный вызов завершения, чтобы перезапустить прием USB, или внедрите более сложный fifo/буфер между usb и uart для буферизации входящих данных по мере их отправки.

Ты прав. Я нашел этот «HAL_UART_TxCpltCallback» для завершения передачи в режиме DMA, но не смог заставить его работать. Есть ли у вас какие-либо предложения, как изменить его?
Извините, но здесь нет ни одного ответа, это может быть довольно сложно. вам решать, как организовать его в соответствии с вашим приложением и потребностями.

Я использовал «HAL_UART_Transmit» для отправки, и он работает хорошо, но не знаю, что не так с «HAL_UART_Transmit_DMA» и «HAL_UART_Transmit_IT».