Forum: Mikrocontroller und Digitale Elektronik Überlauf UART


von UART_Problem (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend,

ich habe ein Problem mit mein UART und zwar wird die alte Übertragung 
zwar gelöscht, aber die aktuelle Übertragung wird hinten angefügt.
Nach drei Übertragungen läuft das ganze dann aus dem Speicher.

Ich habe das ganze mal mit ein Bild veranschaulicht.

Meine Lösungsansätze sieht mann zum Teil im Code. Hat aber alle nichts 
gebracht. Mir kommt es so vor als ob irgend ein Zeiger hochgezählt wird 
und ich die Adresse wieder zurücksetzen muss.

mfg euer UART_Problem

von Rübezahl (Gast)


Lesenswert?

Der Code passt nicht zum Fehlerbild.

von UART_Problem (Gast)


Lesenswert?

Was passt am Code nicht zum Fehlerbild?

mfg euer UART_Problem

von UART_Problem (Gast)


Lesenswert?

Die drei "Test" im Transmit Feld wurde nacheinander gesendet und nicht 
gleichzeitig.

mfg euer UART_Fehler

von Codix (Gast)


Lesenswert?

Das Problem sehe ich so:
Du empfängst nur einmal den Text, den Du in der nachfolgenden Schleife
wieder sendest.


 HAL_UART_Transmit(&huart1, pointer, 10, 100);

Was Du nicht machst ist, dass Du den Rückgabewert des Transmit nicht 
prüfst.
Das solltest Du unbedingt machen.

Es gibt:
HAL_TIMEOUT
HAL_OK
und
HAL_BUSY

Ich vermute, dass Du einen HAL_TIMEOUT bekommen wirst. Denn die 100 
Ticks
sind etwas kurz.
Versuche es mal so:

HAL_UART_Transmit(&huart1, pointer, 10, 0xFFFFFFFF);

von aSma>> (Gast)


Lesenswert?

Servus,
> ich habe ein Problem mit mein UART und zwar wird die alte Übertragung
> zwar gelöscht, aber die aktuelle Übertragung wird hinten angefügt.
> Nach drei Übertragungen läuft das ganze dann aus dem Speicher.

Alles ist richtig. Dein Programm macht genau das was du erstellt hast.

Du hast ja gesagt:
1
HAL_UART_Receive_IT(&huart1, pointer, 10);
Empfange bitte 10 bytes. Du sendest 4 stk. Ein Counter bleibt dort 
stehen und wartet auf die restlichen 6bytes.

Also du musst du in die Fkt. rein schauen und den Zähler auf null 
setzen.

mfg

von Codix (Gast)


Lesenswert?


von UART_Problem (Gast)


Angehängte Dateien:

Lesenswert?

Vielen dank für eure Hilfe bis jetzt. Ich habe erstmal das umgesetzt.

Codix schrieb:
> Was Du nicht machst ist, dass Du den Rückgabewert des Transmit nicht
> prüfst.
> Das solltest Du unbedingt machen.

hier ist die Umsetzung als Link und Bild und wie von eSma schon richtig 
vorhergesagt wurde, hat sich an den Problem nichts geändert.

Jetzt setze ich mich an das hier:

aSma>> schrieb:
> Du hast ja gesagt:HAL_UART_Receive_IT(&huart1, pointer, 10);
> Empfange bitte 10 bytes. Du sendest 4 stk. Ein Counter bleibt dort
> stehen und wartet auf die restlichen 6bytes.
>
> Also du musst du in die Fkt. rein schauen und den Zähler auf null
> setzen.

Weiß aber noch nicht genau wie ich das anstellen soll.

mfg euer UART_Fehler

von aSma>> (Gast)


Lesenswert?

Ich kenne die HAL lib nicht. Ich würde mal die Fkt.:
HAL_UART_Receive_IT(&huart1, pointer, 10);
Immer wieder in der while-Schleife aufrufen.

Dies ist aber nur ein Mittel zum Zweck. Besser ist es ein FIFO Buffer zu 
implementieren mit einen geeigneten Protokol:
[header]   data      [terminator]
['S','1'] "xxx.mpeg" ['\r', '\n']

Frag mich nicht wie es mit HAL geht.

mfg

von UART_Problem (Gast)


Angehängte Dateien:

Lesenswert?

Wenn ich das ganze in die while schleife packe, gibt es immer HAL_Bussy 
als Fehlermeldung. Anscheinend wird die Funktion dann zu oft aufgerufen 
oder sowas in der art.

huart1.RxXferCount = 0; //schon probiert das gleiche ergebni
huart1.pRxBuffPtr = 0;  //hier empfängt oder sendet er nichts mehr

hat alles nichts gebracht habe den aktuellen Code angehangen

mfg euer UART_Fehler

von aSma>> (Gast)


Lesenswert?

UART_Problem schrieb:
> huart1.RxXferCount = 0; //schon probiert das gleiche ergebni
> huart1.pRxBuffPtr = 0;  //hier empfängt oder sendet er nichts mehr

Der counter zählt rückwärts. Wenn du alles auf null setzt, dann heißt 
es, dass schon alles gelesen ist.
1
/* as long as data have to be received */
2
    while(huart->RxXferCount > 0)
3
    {
4
      huart->RxXferCount--;
5
      if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout) != HAL_OK)  
6
      { 
7
        return HAL_TIMEOUT;
8
      }  
9
      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
10
      {
11
        tmp = (uint16_t*) pData ;
12
        *tmp = (uint16_t)(huart->Instance->RDR & uhMask);
13
        pData +=2;
14
      }
15
      else
16
//hier ist dein Problem
17
      {
18
        *pData++ = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask); 
19
      } 
20
    }
*pData++ anfangst bei der Initialisierung auf null setzten
oder noch besser du übergibst als Parameter den Pointer auf die Stelle 0 
zeigend: &buffer_pointer[0].

Ist das so schwer?

mfg

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.