UART Read ließt nur 2 Bytes

OP #7109254
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]
#7109261
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!
#7109264
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"
Gast #7109366
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.