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
Die drei "Test" im Transmit Feld wurde nacheinander gesendet und nicht gleichzeitig. mfg euer UART_Fehler
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);
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

