transmisión STM32 HAL UART

3

Estoy intentando enviar datos por STM32f103 a una placa Arduino usando UART. Los datos no se reciben correctamente. El código se genera utilizando STM32CUBEMX y aquí está la parte que agregué:

Código STM32 (Transmitir):

uint8_t Test[] = "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 \n"; //Data to send 

HAL_UART_Transmit(&huart1,Test,sizeof(Test),10);// Sending in normal mode
HAL_Delay(1000);
HAL_UART_Transmit_DMA(&huart1,Test,sizeof(Test));// Sending in DMA mode
HAL_Delay(1000);

    /* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

}

los datos recibidos son:

  {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 1}
enter code here

tanto en modo DMA como en modo normal, los datos recibidos son bastante similares. La velocidad en baudios de UART es 115200.

¿Por qué se truncan mis datos? ¿Es un problema de límites de matriz? ¿O estoy llegando al límite de mi búfer?

Editar:

Código Arduino (Recibir):

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 9); // RX, TX ports

void setup() {
  // set the data baud rate 
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. 
  }
  mySerial.begin(115200);
}

void loop() { 
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
}

La transmisión de datos funciona bien entre dos placas Arduino.

    
pregunta Mehran

3 respuestas

1

Cuanto mayor sea la velocidad en baudios, más rápido se enviarán / recibirán los datos, pero existen límites a la velocidad a la que se pueden transferir los datos. Por lo general, no verá velocidades superiores a 115200, lo cual es rápido para la mayoría de los microcontroladores. Sube demasiado y comenzarás a ver los errores en el extremo receptor, ya que los relojes y los periodos de muestreo no pueden mantenerse al día.

Pruebe la velocidad de transmisión más baja.

    
respondido por el Majid Hazari
6

Recibe ~ 67 caracteres, que a 10 bits / carácter, es de 670 bits. Dado que su tiempo de espera (parámetro 4) se establece en 10 ms o 0.01 s, la tasa de bits promedio parece ser de alrededor de 67000 bit / s. Mi conjetura es que usted está transmitiendo a 115200 baudios con un retardo entre caracteres que proporciona una tasa de bits efectiva de 67000 bit / s.

Por lo tanto, después de 67 caracteres, 10ms caducan y la rutina de transmisión vuelve.

Para corregirlo, aumente el valor del parámetro 4: el valor del tiempo de espera, al menos a 20.

También verifique que la frecuencia del reloj de su CPU esté correctamente definida en el código de configuración de su proyecto y mídala para asegurarse de que esté dentro del 2.5% del valor deseado.

    
respondido por el neonzeon
0

La biblioteca SoftwareSerial de Arduino no puede funcionar con altas tasas de UART. Nunca lo use con velocidades superiores a 38400 en las placas Uno / Nano, por ejemplo. Si aún quieres 115200 prueba con HardwareSerial.

    
respondido por el Almaz

Lea otras preguntas en las etiquetas