Moin,
ich verwende die uart-library von Peter Fleury,
es funktioniert auch alles.
Allerdings habe ich folgende Modifikationen vorgenommen,
welche nicht so funktionieren wie sie sollen.
Es funktioniert auch ein paar mal (ich glaube immer 4 mal),
dann wird uart_buffer_read nicht mehr geändert?
Wo ist mein Denkfehler?!?
Falls das Design insgesamt unguenstig ist waeren
weitere Hilfen auch immmer willkommen.
Falls noch irgendetwas unklar ist, meldet euch bitte!
Tausend Dank
Matthias
> for(index = 0; index < 9; index++)> {> uart_buffer_read[8-index] = UART_RxBuf[tmphead];> tmphead = ( UART_RxHead - 1 - index) & UART_RX_BUFFER_MASK;> }
1/ Das kräuselt mir die Fußnägel. Was soll hier gemacht werden und kann
man das nicht schöner machen? Solche Subtraktionen bei Arrayzugriffen
haben immer was fischiges.
2/ Das Umkopieren vom Empfangspuffer in den Auswertepuffer könntest du
ja auch in main() machen, wenn du '\r' erkannt hast und dein Flag
newUartData gesetzt hast.
3/ Ich sehe keine Stelle, wo du UART_RxBuf[] entleerst. Kann es sein,
dass der einfach irgendwann nur voll ist und neu empfangene Daten
verworfen werden, oder ist UART_RxBuf[] ein Ringpuffer?
Moin Stefan,
zu 1/ ich möchte den Fischgeruch gerne loswerden,
aber wie "kopiere" ich sonst mein Wort?!?
zu 2/ Du hast recht, man kann dass auch in main() machen,
allerdings ist (nur) so ein "Abwarten" bis das letzte Wort
in main() bearbeitet wurde.
zu 3/ ja UART_RxBuf[] ist ein Ringbuffer,
was heißt eigentlich "entleeren" und wie wird das gemacht.
Entschuldige bitte, sicherlich eine dumme Frage.
Noch einmal zu dem Problem, es funktioniert ein paar mal,
daher vermute ich ein Fehler beim Ringbuffer.
1
// calculate buffer index
2
tmphead=(UART_RxHead+1)&UART_RX_BUFFER_MASK;
3
4
if(tmphead==UART_RxTail){
5
// error: receive buffer overflow
6
lastRxError=UART_BUFFER_OVERFLOW>>8;
7
}else{
8
// store new index
9
UART_RxHead=tmphead;
10
// store received data in buffer
11
UART_RxBuf[tmphead]=data;
12
}
13
UART_LastRxError=lastRxError;
ist von Peter Fleury auch eine Bufferoverflow Behandlung,
warum benötigt man so etwas, eigentlich kann ein Ringbuffer
doch nicht überlaufen, oder?
Schon mal vielen Dank
Matthias
Ringpuffer heisst, dass die Schreibposition (und die Leseposition) vom
Pufferanfang zum Pufferende wandert. Wenn die Schreibposition das Ende
erreicht hat, beginnt die Schreibposition wieder vorne am Ringpuffer,
WENN die Leseposition auch weitergewandert ist und so Platz am
Ringpufferanfang frei gemacht hat. D.h. erst wenn du als Anwender wieder
Platz im Ringpuffer machst (durch Auslesen), kommen frische Daten rein.
In der Doku steht:
UART_BUFFER_OVERFLOW
Receive ringbuffer overflow. We are not reading the receive buffer fast
enough, one or more received character have been dropped
http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html#ga1
D.h. wenn wir nicht auslesen, wird der Ringpuffer voll. So wie es oben
aussieht, hört die Library dann auf, neue Daten in den Ringpuffer zu
schreiben. Und die Library kann dich als Anwender darüber informieren.
Wenn man so eine fertige Library nimmt, ändert man möglichst nicht die
Libraryfunktionen, wenn es anders geht.
Ein Weg ohne Änderung der Library könnte z.B. so aussehen:
Tausend Dank Stefan,
wie Du sicher gemerkt hast bin ich kein guter Programmierer,
um deine Korrekturen / Anmerkungen zu verstehen und bewerten,
muss ich mir die "Ideen" etwas zu Gemüte führen.
Ich danke Dir herzlich
Matthias
UartActive wird in dem Empfangsinterrupt 1 gesetzt,
so dass nur wenn was empfangen wurde,
die "Schleife" durchlaufen werden muss.
Es werden nun alle Befehle in beliebiger Anzahl akzeptiert,
allerdings passieren "dazwischen" jeweils 3 UART_UNKNOWN_ERROR,
was mich aber nicht stört:
received : sdfgdssd
unknown Command
UART_UNKNOWN_ERROR
UART_UNKNOWN_ERROR
UART_UNKNOWN_ERROR
received : loadDATA
if loadDATA
Küss die Hand
Matthias