STM32F4 USB CDC Kommunikation überträgt nur bestimmte Zeichen ohne Rauschen?

Ich arbeite mit dem STM32F407VET6- Board. Und ich versuche, die Kommunikation zwischen meinem PC und dem Mikrocontroller über ein Sample herzustellen, das das überträgt, was es über USB CDC empfängt . Ich habe ein Beispiel für ein USB-Gerät über STM32CubeMX Version 4.16.0 und FW_F4 1.13.0 erstellt .

Mein Problem ist sehr fantastisch und ich weiß nicht, wie ich es googeln soll. Ich benutze;

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) 

Und

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

Funktionen.

Ich höre Ausgaben von /dev/ttyACM0über CuteCom. Außerdem werden Befehle darüber gesendet. Wenn ich eine Zeichenfolge in den Puffer lege, wird sie nicht ohne Rauschen gesendet. Aber es sendet diese Zeichen korrekt (!):

DEC   OCT    HEX    BINARY   CHARACTER   DESCRIPTION
-------------------------------------------------------
63    077    3F    00111111      ?       Question Mark
71    107    47    01000111      G       Uppercase G
75    113    4B    01001011      K       Uppercase K
83    123    53    01010011      S       Uppercase S
99    143    63    01100011      c       Lowercase c
111   157    6F    01101111      o       Lowercase o
119   167    77    01110111      w       Lowercase w

Außerdem lese ich diese Zeichen im Puffer, wenn die Zeichenfolge, die ich über CuteCom gesendet habe, mit einem davon endet. Wenn ich nur den Port abhöre, nichts sende, ändert sich die erste Zeichenfolge und wird ~nach mehreren Übertragungen zum Tilde( )-Zeichen. Hier starte ich die Anwendung, warte und sende die Zeichenfolge in der Reihenfolge: "w", "c", "asdfw", "a", "b", "c", "G":

USB_Tx_buf: STRING_OF_TRANSMIT_BUFFER
USB_Rx_buf: STRING_OF_RECEIVE_BUFFER
-----------------------------------
USB_Tx_buf: E�L
USB_Rx_buf: 1�k
-----------------------------------
USB_Tx_buf: 0@�
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: A��
USB_Rx_buf: TA@
-----------------------------------
USB_Tx_buf:  Ag
USB_Rx_buf: E�L
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: A��
-----------------------------------
USB_Tx_buf: E�L
USB_Rx_buf: 1�k
-----------------------------------
USB_Tx_buf: 0@�
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: 
�z
USB_Rx_buf: 
�z
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: ~
-----------------------------------
USB_Tx_buf: ~
USB_Rx_buf: w
-----------------------------------
USB_Tx_buf: w
USB_Rx_buf: w
-----------------------------------
USB_Tx_buf: w
USB_Rx_buf: w
-----------------------------------
USB_Tx_buf: c
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: c
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: c
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: w
USB_Rx_buf: w
-----------------------------------
USB_Tx_buf: w
USB_Rx_buf: w
-----------------------------------
USB_Tx_buf: w
USB_Rx_buf: w
-----------------------------------
USB_Tx_buf: w
USB_Rx_buf: w
-----------------------------------
USB_Tx_buf: w
USB_Rx_buf: a�Wc~���CEIVE_BUFFER
-----------------------------------
USB_Tx_buf: a�Wc~���CEIVE_BUFFER
USB_Rx_buf: a�Wc~���CEIVE_BUFFER
-----------------------------------
USB_Tx_buf: a�Wc~���CEIVE_BUFFER
USB_Rx_buf: a�Wc~���CEIVE_BUFFER
-----------------------------------
USB_Tx_buf: b�Vc~���CEIVE_BUFFER
USB_Rx_buf: b�Vc~���CEIVE_BUFFER
-----------------------------------
USB_Tx_buf: b�Vc~���CEIVE_BUFFER
USB_Rx_buf: b�Vc~���CEIVE_BUFFER
-----------------------------------
USB_Tx_buf: b�Vc~���CEIVE_BUFFER
USB_Rx_buf: b�Vc~���CEIVE_BUFFER
-----------------------------------
USB_Tx_buf: b�Vc~���CEIVE_BUFFER
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: c
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: c
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: c
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: c
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: c
USB_Rx_buf: c
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
-----------------------------------
USB_Tx_buf: G
USB_Rx_buf: G
...

Und hier ist der Kommunikationsteil des Codes:

...
/* init code for USB_DEVICE */
MX_USB_DEVICE_Init();

/* USER CODE BEGIN startUSBTask */
uint8_t USB_TX_buf[MAX_COMMAND_STR_SIZE];
sprintf ( ( char * ) USB_TX_buf, "STRING_OF_TRANSMIT_BUFFER\r" );
sprintf ( USB_RX_BUF, "STRING_OF_RECEIVE_BUFFER" );
/* Infinite loop */
for ( ;; )
{
    CDC_Transmit_FS ( USB_TX_buf, ( uint16_t ) strlen ( ( char * ) USB_TX_buf ) );
    osDelay ( 10 );
    if (DEBUG) printf ( "USB_TX_buf: %s\nUSB_Rx_buf: %s\n-----------------------------------\n", ( char * ) USB_TX_buf, USB_RX_BUF );
}
/* USER CODE END startUSBTask */
....

Hier sind einige Zeilen von usbd_cdc_if.c, 84 bis 89:

/* Received Data over USB are stored in this buffer       */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
char USB_RX_BUF[APP_RX_DATA_SIZE];

/* Send Data over USB CDC are stored in this buffer       */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];

251 bis 262:

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
    /* USER CODE BEGIN 6 */
    USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
    sprintf(USB_RX_BUF, (char*)Buf);
    return (USBD_OK);
    /* USER CODE END 6 */ 
}

Wo soll ich nach einer Lösung suchen? Oder wie kann ich es auf Google suchen?

Dies ist charakteristisch für falsche Einstellungen der Baudrate und/oder der Start-/Stopbits.
@ pjc50 Diese Einstellungen spielen für das USB-CDC-Protokoll keine Rolle (sie wirken sich nur aus, wenn die MCU-Firmware eine Brücke zu einem "echten" seriellen Anschluss herstellt).
Danke schön. Ich bearbeite die Frage mit Parametern in usbd_conf.cder Datei.
Oh, gerade vor 14 Sekunden. OK, ich bearbeite die Frage nicht :P

Antworten (1)

Cutecom ist eigentlich keine niedliche Software. Es war die Wurzel des Problems. Nachdem ich alle möglichen Korrekturen ausprobiert habe, habe ich dies gerade in das Terminal eingegeben.

echo "CuteCom isn't actually cute software..." > /dev/ttyACM0

und es hat funktioniert! Ich kann jetzt meine Zeichenfolge aus dem Puffer lesen. Ich weiß nicht warum, aber ich hatte schon einmal ein Problem wie dieses. Ich würde mich freuen, wenn jemand meine Antwort verbessern würde.

Seien Sie vorsichtig: Die Eingabe an das Terminal ist langsam und entspricht dem Senden einzelner Zeichen. Sie müssen mit etwas testen, das ganze Pakete sendet. Versuchen Sie alternativ zum Testen, eine ASCII-Textdatei zu senden. Ich habe einmal einen Fehler in einem USB-Treiber von TI gemeldet, den sie übersehen haben, weil sie ihre Tests so vereinfacht hatten, wie Sie es tun.
Danke schön. Ich habe bereits vor, dafür C++-Code zu schreiben. Und ich vertraue dem Terminal mehr als dem CuteCom:P
Versuchen Sie es mit picocom im Terminal - die einzigen Probleme, die ich jemals damit hatte, waren der Zeilen- und der Zeichenmodus (im Zeilenmodus würde es puffern, bis es CR sieht - könnte eine TTY- und keine Picocom-Sache sein).
@Tut: Die Umleitung echosendet die Zeichen nicht, während sie eingegeben werden, sondern wenn der Befehl ausgeführt wird.