Estoy tratando de enviar datos por STM32f103 a una placa Arduino usando UART. Los datos no se reciben correctamente. El código se genera usando 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
en los modos DMA y normal, los datos recibidos son bastante similares. La tasa de 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.
Cuanto mayor sea la velocidad en baudios, más rápido se envían/reciben los datos, pero existen límites en cuanto a la rapidez con la que se pueden transferir los datos. Por lo general, no verá velocidades superiores a 115200; eso es rápido para la mayoría de los microcontroladores. Suba demasiado y comenzará a ver errores en el extremo receptor, ya que los relojes y los períodos de muestreo simplemente no pueden seguir el ritmo.
Pruebe la tasa de baudios más baja.
Recibe ~67 caracteres, que a 10 bits/carácter son 670 bits. Dado que su tiempo de espera (parámetro 4) está configurado en 10 ms o 0,01 s, la tasa de bits promedio parece ser de alrededor de 67000 bit/s. Supongo que está transmitiendo a 115200 baudios con algún retraso entre caracteres, lo que da una tasa de bits efectiva de 67000 bit/s.
Por lo tanto, después de 67 caracteres, 10 ms expiran y vuelve la rutina de transmisión.
Para solucionarlo, aumente el valor del parámetro 4, el valor de tiempo de espera, al menos a 20.
También verifique que la frecuencia de 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 previsto.
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
y SysTick es lo que se usa para esos retrasos en HAL de ST.HAL_UART_Transmit(&huart1,Test,sizeof(Test),10);
por lo que el último parámetro fue definido por el usuario. Un tiempo de espera ligeramente mayor nunca está mal.La biblioteca SoftwareSerial de Arduino no puede operar con altas tasas de UART. Nunca lo uses con velocidades superiores a 38400 en placas Uno/Nano por ejemplo. Si aún desea 115200, pruebe HardwareSerial en su lugar.
Stefan Merfu
Bence Kaulics
Mehran
VanGo
Mehran