Forum: Mikrocontroller und Digitale Elektronik STM32F4 DISCOVERY BOARD USART HAL buffer Ausgabeproblem


von Jörg K (Gast)


Angehängte Dateien:

Lesenswert?

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?

von soundso (Gast)


Lesenswert?

Hallo

benutze doch auch in der transmit_to_2() Funktion die HAL Library :
1
HAL_UART_Transmit(&huart2, (uint8_t *)Transmit_buf, TXBUFSIZE, 100);
nur ein Enable des Transmit-Interrupt sendet noch nichts ...

sonst wird nie was gesendet.

Ich würde auch die while(xyz) durch if(xyz) hier ersetzten, so "läuft" 
dein main immer durch und du kannst noch andere Sachen machen ...

hast du die Maskierungen in den Bufferindexen gut durchdacht? evtl. 
passt da auch etwas nicht... (ist eher ungewöndlich/unleserlich was du 
da machst ...)

von pegel (Gast)


Lesenswert?

HAL ist eigentlich gedacht das Leben einfacher zu machen. ;)

Schau dir die Funktion void HAL_UART_RxCpltCallback an,
damit sind es nur noch ein paar Zeilen Code.

von Jörg K (Gast)


Lesenswert?

pegel schrieb:
> HAL ist eigentlich gedacht das Leben einfacher zu machen. ;)
>
> Schau dir die Funktion void HAL_UART_RxCpltCallback an,
> damit sind es nur noch ein paar Zeilen Code.

Vielen Dank, das hat das Ganze erheblich erleichtert!

bzgl. der Callback war dieser Link sehr hilfreich:

https://www.waveshare.com/wiki/STM32CubeMX_Tutorial_Series:_USART

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.