Forum: Mikrocontroller und Digitale Elektronik UART Read ließt nur 2 Bytes


von Leonidas T. (helpleo)


Lesenswert?

Das UART-Modul umfasst die folgenden Funktionen:
- Halb- und Vollduplex asynchrones Senden und Empfangen
- Zwei-Byte-Eingangspuffer !!!!!
- Ein-Byte-Ausgangspuffer

Und es ist wahr, denn wenn ich eine LED in die While-Schleife stecke. 
Wird sie zwei mal blinken und dann die while - Schleife verlassen.
1
payload[] = {0};
2
      while(UART5_is_rx_ready()) {
3
4
            LATBbits.LATB3 = 1;
5
            __delay_ms(100);
6
            paylaod[i] = UART5_Read();
7
            i++;
8
            LATBbits.LATB3 = 0;
9
            __delay_ms(100);
10
        }

Gibt es eine Möglichkeit, den Puffer zu erweitern? Oder wie kann ich das 
noch schreiben. Vielleicht Ring Buffer?

Ich bin für jeden Antwort dankbar!

[MOD: c-Tags eingefügt]

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Leonidas T. schrieb:
> Ich bin für jeden Antwort dankbar!
Welche Hardwareplattform? Welche Programmiersprache mit welchem 
Compiler? Welche Bibliothek?

: Bearbeitet durch Moderator
von N. M. (mani)


Lesenswert?

Leonidas T. schrieb:
> payload[] = {0};

Keine Größenangabe. Also nur 1 Zeichen reserviert.

Leonidas T. schrieb:
> paylaod[i] = UART5_Read();
>             i++;

Beim 2. Zugriff bist du Out of Bound!

Leonidas T. schrieb:
> Wird sie zwei mal blinken und dann die while - Schleife verlassen.

Na dann springt dein Controller entweder in den Reset/Trap Vektor wegen 
dem falschen Speicherzugriff oder UART5 ist nicht mehr ready (wieso auch 
immer) und die Schleife wird verlassen.
Rufst du den Codefetzen nur einmal auf?

Leonidas T. schrieb:
> while(UART5_is_rx_ready()) {

ZEIGE DEN GANZEN CODE!

von Peter D. (peda)


Lesenswert?

Leonidas T. schrieb:
> Gibt es eine Möglichkeit, den Puffer zu erweitern?

Ja. Man implementiert eine FIFO im UART-Interrupt mit der gewünschten 
Größe. Für Deinen MC sollte leicht Beispielcode für eine UART-FIFO zu 
finden sein.

Eine weitere Task in der Mainloop sammelt dann alle ankommenden Bytes in 
einen Paketpuffer und prüft auf das Paketende. Das geht aber nur, wenn 
Du das entsprechende Protokoll implementierst. Im Datenblatt des Travos 
3 Modul ist ja das Protokoll schön beschrieben, siehe "7. The command 
interface".
Ohne das Protokoll zu implementieren wirst Du nie eine stabile und 
fehlerfreie Übertragung erreichen.

https://www.we-online.com/katalog/de/TARVOS-III

Beitrag "PIC Mikrocontroller UART READ"

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Leonidas T. schrieb:
> paylaod[i] = UART5_Read();

Mit dem Tippfehler gaht sowieso nix.

von Leonidas T. (helpleo)


Lesenswert?

Vielen dank, das ist schon mal sehr hilfreich :)

von W.S. (Gast)


Lesenswert?

Leonidas T. schrieb:
> Das UART-Modul umfasst die folgenden Funktionen:

... und wartet zwischendurch 2x je 100 ms. Also, dein Kunstwerk graust 
mich.

Dabei ist das Problem hier doch bereits gefühlte 1000mal diskutiert 
worden:
- Man richte sich für jede Richtung (RX und TX) je einen Ringpuffer ein
- Die Treiberfunktionen zum Verkehr mit den übrigen Programmteilen lesen 
NUR vom RX-Ringpuffer und schreiben NUR in den TX-Puffer. Allenfalls 
schaltet die Funktion zum senden den TX-Interrupt-Enable ein, nachdem 
sie ein Zeichen in den Ringpuffer geschrieben hat. Näheres siehe 
HW-Manual.
- Das Füllen des RX-Ringpuffers und das Entleeren des TX-Ringpuffers 
erledigt NUR eine (oder bei manchen Architekturen zwei) 
Interrupt-Service(s).

W.S.

Beitrag #7109380 wurde von einem Moderator gelöscht.
Beitrag #7109453 wurde von einem Moderator gelöscht.
Beitrag #7109469 wurde von einem Moderator gelöscht.
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.