USB VCP-CDC und UART auf STM32

Ich habe USB-VCP-Code für "STM32F103C8T6" mit STM32CubeMX generiert. Ich versuche, empfangene Daten per STM vom PC mit UART an ein Arduino-Board zu senden. Der Code funktioniert gut für Daten mit geringer Größe, aber wenn ich größere Daten senden möchte, sind die empfangenen Daten in Arduino beschädigt. Ich verwende "Teraterm" und "Realterm", um Daten vom PC an STM32 zu senden. Ich habe das CDC_Receive_FSfür das Senden von Daten über UART im DMA-Modus geändert, hier ist der Code:

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

}

Ich habe das geschickt

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

und erhalten

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

Die USART-Baudrate beträgt 19200, und in STM32 APP_RX_DATA_SIZEist die Größe des empfangenen Puffers auf 640 definiert. Was soll ich tun?

Antworten (2)

Wenn Sie die uart dma- oder Interrupt-Version verwenden, blockiert sie nicht, die uart-Funktion kehrt sofort zurück, bevor die Daten vollständig gesendet werden. So kommt es vor, dass Sie sich darauf vorbereiten, neue Daten von USB zu empfangen, bevor sie zuvor an uart gesendet wurden. Da Sie denselben Puffer für USB rx und uart tx verwenden, beginnt USB mit dem Auffüllen des Puffers, da er immer noch von uart gesendet wird (warum Sie Dinge vermissen).

Wenn Sie dma verwenden oder es dann den Abschluss-Callback verarbeiten, um den USB-Empfang neu zu starten, oder einen ausgefeilteren Fifo/Puffer zwischen USB und UART implementieren, um eingehende Daten zu puffern, wenn sie gesendet werden.

Du hast Recht. Ich habe dieses "HAL_UART_TxCpltCallback" für das Ende der Übertragung im DMA-Modus gefunden, konnte es aber nicht zum Laufen bringen. Haben Sie einen Vorschlag, wie man es ändern kann?
Entschuldigung, aber hier gibt es keine einzige Antwort, es kann ziemlich kompliziert sein. Es liegt an Ihnen, die IT-Suite für Ihre App zu organisieren und zu benötigen.

Ich habe "HAL_UART_Transmit" zum Senden verwendet und es funktioniert gut, aber ich weiß nicht, was mit "HAL_UART_Transmit_DMA" und "HAL_UART_Transmit_IT" falsch ist.