Gast
#5210682
Hallo, Ich habe hier ein Problem mit dem Einlesen und direkten Wiederausgeben von Zeichen über den USART2 unter Verwendung von den STM32 HAL Treiber. Ich nutze die STM32 AC6 system work bench als IDE. http://www.st.com/en/development-tools/sw4stm32.html unter Ubuntu LTS 16.04 Das verwendete Board ist das STM32F407G-DISC1. Anbei befinden sich drei Dateien, die einen Ausschnitt aus dem Code beinhalten. (also nur die Sachen, die in Bezug auf den USART2 relevant sind) Nun zum Ablauf, wie es eigentlich funktionieren müsste: 1. bis in die while(1) Schleife geht es ohne Probleme, - der String "please enter..... bla" wird über den USART "rausgeschoben" 2. dann hängt er erwarteterweise in der while(1) Schleife - die Bedingung von while(rx_i != rx_e) ist nicht erfüllt - also es ist noch kein Zeichen vom User eingegeben worden , da rx_i die Anzahl der empfangenen Zeichen beinhalten und rx_e die Anzahl der bereits wieder ausgegebenen Zeichen beeinhaltet (beide Variablen haben den Wert 0) 3. Nun gebe ich etwas ein und im Interrupt-Handler "USART2_IRQHandler" werden nach und nach alle Zeichen eingelesen und in "buffr" gespeichert. - das klappt soweit auch, die Daten kann ich mir beim Debuggen anschauen 4. Nun sollte dann auch rx_i (Anzahl der in buffr abgelegten Zeichen) nicht mehr 0 sein und die Bedingung while (rx_i != rx_e) sollte erfüllt sein!!! wenn ich beim debuggen "anhalte" und mir die Inhalten von rx_i und rx_e anschaue, ist rx_e = 0 und rx_i = 2 (wenn ich zuvor zwei Zeichen an den USART2 geschickt habe.) --> dennoch wird das, was in while (rx_i != rx_e) steht, nicht erreicht! transmit_to_2(buffr[RXBUF_MSK & rx_e]) wird nicht ausgeführt. 5. wenn ich einen breakpoint in den USART2_IRQHandler lege und danach "händisch" wieder "raussteppe" also mit "step over" geht es, dann wird der Inhalt von "buffr" ausgeben, also die Bedingung von while (rx_i != rx_e) ist auf einmal doch erfüllt und die Funktion transmit_to_2(buffr[RXBUF_MSK & rx_e]) wird aufgerufen. --> wodran kann das liegen, also lasse ich das frei laufen wird nichts ausgegeben (der buffr wird zwar beschrieben) --> stepe ich händisch durch den Handler wird auch etwas ausgegeben. also while (rx_i != rx_e) wird richtig ausgewertet! wodran könnte es liegen? werden irgendwelche flags nicht gesetzt/zurückgesetzt? Compileroptionen /Optimization falsch?