Ich versuche, Daten von STM32f103 mit UART an ein Arduino-Board zu senden. Daten werden nicht richtig empfangen. Der Code wird mit STM32CUBEMX generiert und hier ist der Teil, den ich hinzugefügt habe:
STM32-Code (Senden):
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();
}
}
Die empfangenen Daten sind:
{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
Sowohl im DMA- als auch im normalen Modus sind die empfangenen Daten ziemlich ähnlich. Die UART-Baudrate beträgt 115200.
Warum werden meine Daten abgeschnitten? Ist es ein Array-Bounds-Problem? Oder stoße ich an die Grenze meines Puffers?
Bearbeiten:
Arduino-Code (Empfangen):
#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());
}
}
Die Datenübertragung zwischen zwei Arduino-Boards funktioniert gut.
Je höher die Baudrate ist, desto schneller werden Daten gesendet/empfangen, aber es gibt Grenzen, wie schnell Daten übertragen werden können. Sie werden normalerweise keine Geschwindigkeiten über 115200 sehen - das ist für die meisten Mikrocontroller schnell. Wenn Sie zu hoch werden, werden Sie beginnen, Fehler auf der Empfängerseite zu sehen, da Takte und Abtastperioden einfach nicht mithalten können.
Niedrigere Baudrate testen.
Sie erhalten ~67 Zeichen, was bei 10 Bit/Zeichen 670 Bit entspricht. Da Ihr Timeout (Parameter 4) auf 10 ms oder 0,01 s eingestellt ist, scheint die durchschnittliche Bitrate bei etwa 67000 Bit/s zu liegen. Ich vermute, dass Sie mit 115200 Baud mit einer gewissen Verzögerung zwischen den Zeichen übertragen, was eine effektive Bitrate von 67000 Bit / s ergibt.
Daher laufen nach 67 Zeichen 10 ms ab und die Senderoutine kehrt zurück.
Um das Problem zu beheben, erhöhen Sie den Wert von Parameter 4 – den Timeout-Wert – auf mindestens 20.
Überprüfen Sie auch, ob Ihre CPU-Taktfrequenz in Ihrem Projekt-Setup-Code korrekt definiert ist, und messen Sie sie, um sicherzustellen, dass sie innerhalb von 2,5 % des beabsichtigten Werts liegt.
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
und SysTick wird für diese Verzögerungen in der HAL von ST verwendet.HAL_UART_Transmit(&huart1,Test,sizeof(Test),10);
daher war der letzte Parameter benutzerdefiniert. Ein etwas größerer Timeout ist nie schlecht.Die SoftwareSerial-Bibliothek von Arduino kann nicht mit hohen UART-Raten arbeiten. Verwenden Sie es beispielsweise niemals mit Geschwindigkeiten über 38400 auf Uno/Nano-Boards. Wenn Sie immer noch 115200 wollen, versuchen Sie es stattdessen mit HardwareSerial.
Stefan Merfu
Bence Kaulics
Mehran
VanGo
Mehran