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?
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 ...)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.