STM32F4 USB CDC ¿La comunicación transfiere solo caracteres específicos sin ruido?

1

Estoy trabajando con el STM32F407VET6 . Y estoy tratando de establecer una comunicación entre mi PC y el Micro Controller a través de una muestra que transmite lo que recibe a través de USB. He creado un ejemplo de dispositivo USB a través de la versión STM32CubeMX 4.16.0 y FW_F4 1.13.0 .

Mi problema es muy fantástico y no sé cómo buscarlo en Google. Estoy usando;

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) 

y

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

funciones.

Estoy escuchando las salidas de /dev/ttyACM0 a través de CuteCom. Además, enviando comandos a través de él. Si pongo alguna cadena en el búfer, no se envía sin ruido. Pero envía estos caracteres correctamente (!):

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

También leo estos caracteres en el búfer si la cadena que envié a través de CuteCom termina con uno de ellos. Si solo escucho el puerto, no envío nada, la primera cadena está cambiando y cambia al carácter de tilde ( ~ ) después de varias transmisiones. Aquí, estoy iniciando la aplicación, esperando y enviando la cadena en orden de: "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
...

Y aquí está la parte de la comunicación del código:

...
/* 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 */
....

Aquí hay algunas líneas de usbd_cdc_if.c , 84 a 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 a 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 */ 
}

¿Dónde debo buscar una solución? O ¿Cómo puedo buscarlo en Google?

    
pregunta Orhan G. Hafif

1 respuesta

2

Cutecom no es realmente un software lindo. Fue la raíz del problema. Después de probar todos los arreglos posibles, acabo de escribir en la terminal;

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

y funcionó! Puedo leer mi cadena desde el búfer ahora. No sé por qué, pero me enfrenté a un problema como este antes. Sería feliz si alguien mejorara mi respuesta.

    
respondido por el Orhan G. Hafif

Lea otras preguntas en las etiquetas