Andrey schrieb:
> und kriege sogar drei Zeichen aus den zehn gesandten zu empfang.
> Restliche sieben Zeichen sind wieder geschluckt.
Kardinalfehler.
Nur weil DU am Terminal 10 Tasten drückst, bedeutet das nicht, dass die
an der Gegenstelle auch alle 10 auf einem aus dem Read Code rauskommen.
1 | while (1)
|
2 | {
|
3 | // if USART2 data received ?
|
4 | if(usart2_getUsart2Ctrl()->flagRx == 1)
|
5 | {
|
sobald das erste Zeichen übertragen wurde, kriegst du hier schon die
Benachrichtigung, dass etwas auf der UART eingetrudelt ist. Die UART
kann ja nicht wissen, dass du noch weitere 9 mal auf eine Taste drücken
wirst.
D.h. wenn du dir die bisher eingetrudelten Daten dann abholst, kannst du
nicht a prioir sagen: da sind jetzt 10 Bytes in der UART. Es sind so
viele Bytes in der UART, wie bis zu diesem Zeitpunkt übertragen wurden.
Und während du dir die bisher übertragenen Bytes abholst, läuft die
Übertragung weiter. D.h. während dieser Code
1 | // copy Rx Buffer to Tx Buffer
|
2 | sprintf(usart2_getUsart2Ctrl()->txBuf,usart2_getUsart2Ctrl()->rxBuf);
|
3 | // send received data back to terminal
|
4 | usart2_sendDataDma(usart2_getUsart2Ctrl()->txBuf, strlen(usart2_getUsart2Ctrl()->txBuf));
|
5 | // clear Flag
|
6 | usart2_getUsart2Ctrl()->flagRx = 0; // clear Rx flag
|
7 | memset(usart2_getUsart2Ctrl()->rxBuf,'\0',sizeof(usart2_getUsart2Ctrl()->rxBuf)); // clear Rx buffer
|
läuft, ist noch immer Aktivität auf der UART. Was natürlich blöd ist,
weil du dir mit dem memset ganz zum Schluss genau diese in der
Zwischenzeit eingetrudelten Bytes über den Haufen schiesst.
Der Kardinalfehler besteht praktisch immer in der Annahme, man würde aus
einer UART komplette Strings rauskriegen, die genau so lang sind wie
die, die die Gegenstelle auf den Weg bringt. Dem ist nicht so. Du musst
darauf vorbereitet sein, dass du das Übertragene in kleinen Happen
kriegst und das entweder auch in kleinen Happen verarbeiten musst oder
aber erst mal die kleinen Happen wieder zu kompletten Strings
zusammensetzen musst. Oder warum denkst du, ist es üblich eine Eingabe
am einem Sichtgerät (meistens) mit einem Druck auf die Return-Taste
abzuschliessen?