Georg M. schrieb:
> Aber warum brauche ich das delay von 2 ms???
Weil du hier in dieser Schleife ...
1 | while(Serial2.available())
|
2 | {
|
3 | //Zwischenpeichern der Daten in einem Array aus dem Ringspeicher
|
4 | data[dataLen] =Serial2.read();
|
5 |
|
6 | ...
|
7 | }
|
davon ausgehst, dass du ein komplettes Telegram damit abarbeiten kannst.
Dem ist aber nicht so. Dein µC rechnet viel schneller, als die USART
übertragen kann. D.h. die available Schleife ist zu Ende und das
Telegram ist noch gar nicht vollständig reingekommen.
Beim nächsten Zeichen des Telegramms, welches du mitten drinn
abgebrochen hast, wird zwar die Event Funktion wieder aufgerufen. Aber
zu diesem Zeitpunkt hast du die Variable sizeofdata schon verloren (weil
es eine lokale Variable ist) und keine Ahnung mehr, wieviele Zeichen
eigentlich noch fehlen, bis dieses eine Telegramm fertig ist.
Baust du dagegen den delay ein, dann zwingst du den µC dazu Zeit zu
vertrödeln. Zeit, in der die Gegenstelle wieder ein Zeichen per UART
übertragen kann, welches dann dazu führt, dass available() wieder ein
Zeichen für den read() hat, wodurch die while-Schleife weiterläuft bis
dann irgendwann sizeofdata Zeichen bearbeitet wurden.
> Damit bei zu schnell eingehenden Telegrammen
:-) Das genaue Gegenteil ist der Fall. Der µC ist viel schneller, als
die Gegenstelle senden kann.