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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren