Ein Problem könnte die verborgen verwendete String Klasse bei
"Serial.write(client.read());" sein.
Zum Einen blockiert sie bis zu einem Timeout, was deine Latenzen
erklärt. Zum Anderen kann sie (wenn du Pech hast) bis zu ca. 5 Kilobyte
Daten am Stück liefern, was ratz fatz zu einem Stack überlauf führt. Der
Stack ist nämlich nur irgendwo zwischen 4 und 5kB klein!
Das passiert vor allem, wenn sich WLAN mal Daten angestaut haben und
dann alle zusammen "auf einmal" eintreffen.
Die Art, wie du den seriellen Port verwendest, macht es noch träger.
Denn der serielle Port hat nur einen kleinen Puffer (meist 64 Bytes).
Wenn du mehr zu senden versuchst, als da rein passt, muss das Programm
lange warten.
Ändere deine Schleife so, dass sie niemals warten muss. Und zwar weder
auf Netzwerk noch auf die serielle Schnittstelle.
read() kannst du daher schonmal vergessen. Es gibt aber eine andere
nicht blockierende read Funktion, die in ein char-array einliest und dir
zurück liefert, wie viele Zeichen sie geliefert hat.
Vor dem Schreiben kannst du abfragen, für wie viele Zeichen der
Sende-Puffer frei hat. Wenn er nicht genug Platz hast, dann warte nicht,
sondern sende nur so viel wie gerade geht und spare Dir den Rest für
einen späteren Durchlauf der loop Schleife auf.
Um das zu ermöglichen brauchst du wiederum große Puffer in deinem
Sketch. Der Puffer sorgt dafür, dass du weniger häufig überschüssige
Daten verwenfen musst. Du kannst sie später senden - sofern dein Puffer
nicht überläuft.
Das WLAN Netz hat im Gegensatz zur seriellen Schnittstelle eine sehr
unregelmäßige Performance. Stell Dir vor, ein µC sendet mit 115200 Baud
kontinuierlich so schnell er kann und dann stockt die Übertragung für
eine halbe Sekunde (was durchaus normal ist). Dann stauen sich irgendwo
etwa 6000 Bytes an. Nachdem die Übertragung wieder läuft, musst du nun
diese 6000 Bytes seriell abliefern, aber gleichzeitig kommen genau so
schnell neue Daten herein.
Das ist ein Dilemma und das ist das Hauptproblem sämlticher
Seriell/Netzwerk Adapter, die es gibt. Man muss funktional Abstriche in
Kauf nehmen, und zwar entweder:
a) Wenn über Netz mehr Daten rein kommen, als man seriell Senden kann,
verwirft man Teile davon.
oder
b) Man verwendet sehr große Puffer und hofft, dass der Absender
irgendwann mal eine Pause einlegt, in der man die angestauten Daten
abarbeiten kann. Aber auc diese Puffer können überlaufen, dann musst du
doch Daten verwerfen.
Dein jetziges Programm verwirft auch Daten, das ist Dir eventuell nur
noch nicht aufgefallen, weil die WLAN Schnittstelle etwa 5kB empfangene
Daten puffern kann und der Sender notfalls einige male Wiederholt, falls
etwas verloren geht. Doch das geht eben massiv auf die Latenz Zeit und
dennoch können die Puffer überlaufen.
Programme, die für serielle Kabel gedacht sind, erwarten jedoch eine
kontinuierliche Lückenlose Übertargung ohne verlorene Teile. Deine WLAN
Brücke kann nur dann zufriedenstellend funktionieren, wenn die seriellen
Programme die stockende Übertragung im WLAN tolerieren und durch
Soft-Handshake sicherstellen, dass sie die Puffer nicht überfüllen.
Bei einer Halb-Duplex Kommunikation ergibt sich das von ganz alleine. Im
fokgenden Beispiel sind (A) und (B) die seriellen Programme:
(A) zu (B): Schalte mal das Licht an!
(B) zu (A): Ist erledigt
1 Sekunde Pause
(A) zu (B): Schalte das Licht wieder aus!
(B) zu (A): Ist erledigt
Hier haben wir ein Soft-Handshake. Der Befehlsgeber wartet immer auf die
Rückmeldung, bevor er den nächsten Befehl sendet. Was könnte ohne
Handshake passieren?:
(A) zu (B): Schalte mal das Licht an!
WLAN ist gestört, das Kommando kommt zunächst nicht an.
1 Sekunde Pause
WLAN geht wieder, jetzt kommt das Kommando bei (B) an.
(B) schaltet das Licht an.
gleichzeitig kommt schon der nächste Befehl herein:
(A) zu (B): Schalte das Licht wieder aus!
(B) schaltet das Licht aus.
Das Licht wurde ein und dann sofort wieder ausgeschaltet. Vermutlich
flackert es nur kurz, falls man es überhaupt wahrnimmt. Dieses Ergebnis
hatte A aber nicht gewollt. Gewollt war, dass das Licht eine Sekunde an
ist.
Versteht du das Problem jetzt?