Я сгенерировал код 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. Что мне делать?
когда вы используете uart dma или версию с прерыванием, она не блокируется, функция uart возвращается сразу же, прежде чем данные будут полностью отправлены. Поскольку вы используете один и тот же буфер для usb rx и uart tx, usb начнет перезаполнять буфер, так как он все еще отправляет uart (почему вы что-то пропускаете).
если использовать dma или его, то обработайте обратный вызов завершения, чтобы перезапустить прием USB, или внедрите более сложный fifo/буфер между usb и uart для буферизации входящих данных по мере их отправки.
Я использовал «HAL_UART_Transmit» для отправки, и он работает хорошо, но не знаю, что не так с «HAL_UART_Transmit_DMA» и «HAL_UART_Transmit_IT».
Мехран
Мишель Санчес