Hallo zusammen, ich habe ein kleines Problem mit meinem STM32 und dem Empfang der Daten über UART_DMA. Ich (re)starte meinen Nucleo Board, ich sende Daten via RS232 zur Gegenstelle (mit Oszi gemessen) und bekomme auch antworten (ebenfalls mit Oszi gemessen). Die Daten haben eine variable Länge, allerdings kenne ich die immer vorher und kann diese Info beim Aufruf von "HAL_UART_Receive_DMA(&huart2, bBuf, bLen)" mitgeben. --> passt. Funktioniert beliebig oft mit variabler Datenlänge. Jetzt lege ich die Gegenstelle schlafen, warte 20s und wecke sie mit einer WAKEUP/INIT Funktion auf. Gegenstelle wacht auf und initialisiert sich und signalisiert via LED "bereit". Alle Anfragen danach werden ganz normal verarbeitet und ich bekomme Antworten. Wenn ich die Gegenstelle schlafen lege, dann eine beliebige Funktion (nicht die WAKEUP/INIT) schicke, bleibt die Gegenstelle im Sleep Mode (so soll es auch sein). Wenn ich danach die Wakeup/Init schicke, wachte die Gegenstelle auf, allerdings bekomme ich die Antwort ("Init erfolgreich") der Gegenstelle nicht mit, obwohl ich sie am Oszi sehe. Mir scheint das die HAL_UART_Receive_DMA(...) irgendwie blockiert ist, da die eine normale Funktion den Empfang blockiert. Ich bin jetzt schon mit dem Debugger durch gesprungen, aber ich bekomme keinen Error oder Hänger, er spingt brav durch die Funktionen, so wie er es auch macht die Sache funktioniert, nur der Empfangsbuffer bleibt halt leider leer. Gibt es da einen Trick, wie man den UART Empfang per DMA neu starten kann? Ich würde ja HAL_UART_Receive_DMA(...) nehmen, dafür müsste ich ja die wissen welche Anfrage an die Gegenstelle ich zu erst schicke, da ich die Länge hinterlegen muss. Viele Grüße
Hatte erst letzte Woche das gleiche Problem. Habe den Usart DMA mit LL Treiber initialisiert und mich durch dieses Tutorial gehangelt. https://stm32f4-discovery.net/2017/07/stm32-tutorial-efficiently-receive-uart-data-using-dma/ Der DMA läuft im Circular mode und schreibt den Buffer immer wieder erneut voll. In der Funktion usart_rx_check schaut er wie lange die neu eingetroffene Nachricht im DMA buffer ist und kann diese dann weiter verarbeiten. Als interrupt habe ich nur die Idle Line benutzt. Dieser löst aus, sobald auf der RX Leitung nichts mehr übertragen wird.
Hier findest du den Beispiel code zu diesem Tutorial: https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx
Danke für die schnelle Antwort! Dann müsste ich den DMA Mode zu "circular" ändern, davon hatte ich auch schon gelesen. Im Prinzip weiß ich ja aber immer wann meine Datenblöcke zu Ende sind, ist der "circular mode" da nicht mit Kannonen auf Spatzen? Ich dachte an so eine Art "UART/DMA ReInit" Geschichte, bloß nicht ganz so banal :D. VG
RS020 schrieb: > ist der "circular mode" da nicht mit Kannonen auf Spatzen? Naja wenn es deine Problem löst, wüsste ich nicht warum man es nicht so machen sollte. Du kannst jede Nachricht unterschiedlicher länge verarbeiten. RS020 schrieb: > nur der Empfangsbuffer bleibt halt > leider leer. Ist er wirklich leer oder nur voll und wird nicht neu befüllt?
Walt N. schrieb: > Ist er wirklich leer oder nur voll und wird nicht neu befüllt? Er wird immer bevor ich die Funktion HAL_UART_Receive_DMA(...) aufrufe geleert, die Daten kommen auch an (am Oszi sichtbar) nur werden sie halt nicht in meinen Buffer geschrieben. Ich versuch grad das Tutorial durchzuackern, welches du verlinkt hast. Danke nochmal dafür! VG
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.