HC05 Bluetooth Datentransfer kommt zum Stillstand.

Muss mich doch wieder melden. Komme einfach nicht mehr weiter.
Momentaner Stand:
Daten können problemlos gelesen oder empfangen werden. Heißt:

  • Der Arduino Mega macht folgendes: Ließt anstehende Daten und sende einen String "Test,Test,Test,Test" über Hardware Serial1 an den HC05. Das wird alle 50ms gemacht.
  • Der PC macht folgendes: Ließt alle 50ms die anstehenden Daten aus.
    Soweit funktioniert eigentlich auch alles wunderbar.

Jetzt zum Problem.
Der Arduino bleibt die ganze Zeit über unverändert. Nur wenn ich am PC statt Daten zu lesen, alle 50ms eine String "Hallo" sende, dann geht das für die ersten paar Sekunden auch gut. Die Serial Konsole vom Arduino zeigt mir schön das "Hallo" an. Doch dann urplötzlich zeigt die Konsole immer langsamer das "Hallo" an und bleibt dann auch relativ schnell stehen. Am PC wird mir dann angezeigt dass die Daten nicht mehr übertragen werden konnten. Breche ich die Übertragung vom PC aus ab so reagiert das HC05 Modul nicht mehr (Verbindungsstatus-LED bleibt an) und ich muss den Arduino neu starten.
Jetzt noch zu einem interessanten Detail des Problems.
Am Arduino wird wieder nichts verändert. Der sendet und ließt immer noch alle 50ms Daten.
Sobald ich aber gleichzeitig Daten alle 50ms vom PC sende UND empfangene Daten auslese dann geht wieder alles problemlos.
Will ich also alle 50ms Daten vom PC aus senden so muss ich auch alle X ms anstehende Daten auslesen.. sonst geht es nicht.
Warum ist das so :o ?
Mir scheint es schon fast so als würde es iwo einen Datenstau geben und deshalb die Verbindung langsamer bzw. zum erliegen kommen.

Hat jemand eine Antwort bzw. sogar eine Lösung für das Phänomen?

P.S. Um Daten am PC zu empfangen und zu senden benutze ich einen USB Bluetooth Stick und diese c++ Klasse hier ->Arduino Playground - CPPWindows
Um Daten am Arduino Mega 2560 zu empfangen und zu senden schließe ich einfach das HC05 Modul an die RX1/TX1 an. TX1 vom Arduino wird dabei über einen Spannungsteiler (auf 3.3V) an RX des BT verbunden. Gesendet und empfangen wird ganz normal wie hier gezeigt -> http://www.arduino.cc/en/Tutorial/MultiSerialMega

Edit:
Schalte ich DTR (data-terminal-ready) FlowControl am PC aus dann gehts wieder. Wie es jetzt mit Fehlern bei der Übertragung aussieht weiß ich nicht.. größtenteils scheint noch alles i. O. zu sein. Komisch. Sicherlich füllt der Arduino den Ausgangsbuffer des HC05 und leert durchgehend den Eingangsbuffer welcher vom PC aus durchgehend gefüllt wird. Kann es sein dass beim HC05 Eingans- und Ausgangsbuffer die selben sind? Wenn ja dann würde sich klären warum sich das Problem löst wenn ich den Ausgangsbuffer übern PC durch auslesen anstehender Daten leere. Deaktivieren von DTR scheint mir als Lösung keine gute Idee zu sein :S
Edit2:
Habe nun auch mal den EingangsBuffer "(den ich ja nicht mehr auslese/leere) überprüft.

	COMSTAT status = { 0 };
	DWORD errorCode;
	ClearCommError(hPort, &errorCode, &status);
	printf(to_string(status.cbInQue).c_str());

Der geht schön von 0-8092 Bytes hoch. Höher wie 8092 Bytes geht er nicht und ab da fängt dann auch die Übertragung an ins stocken zu geraten bzw. kommt letztendlich zum erliegen. Ich blick zwar immer noch nicht ganz durch aber iwie soll sichergestellt werden dass das Senden von Daten übern PC nicht dadurch blockiert wird, weil der Arduino mir den Eingangsbuffer (denn ich mal für eine gewisse Zeit nicht leere) voll schreibt. Ist das deaktivieren von DTR denn doch ggf in diesem Fall sinvoll?

Die Serial Klasse selbst auch Ausgangs- und Eingangspuffer von je 64 Byte (Standard. Kann man auch größer machen). Wenn du die zu schnell voll schreibst (z.B. weil du den Eingangspuffer nicht schnell genug leerst) bekommst du auch Probleme.

Serenifly:
...Wenn du die zu schnell voll schreibst (z.B. weil du den Eingangspuffer nicht schnell genug leerst) bekommst du auch Probleme.

Aha ok. Ja so wie's aussieht liegt iwo da wahrscheinlich mein Problem. Ich gehe momentan davon aus dass Eingangspuffer und Ausgangspuffer getrennt sind und somit ein gefüllter Eingangspuffer nicht das Senden blockieren kann und umgekehrt ein gefüllter Ausgangspuffer nicht das Empfangen blockiert. Uff ich muss ja zu geben dass ich ein Anfänger (Schüler) bin. Eigentlich wollte ich nur eine Bluetoothverbindung zwischen Arduino und PC die ca. alle 50ms auf der jeweiligen Seite anstehende Daten auswertet und bestimmte Daten sendet (zur Steuerung eines Autos). Tja.... so einfach ist's wohl dann doch nicht.
Zwar habe ich kaum noch Zeit um das Projekt zum laufen zu bekommen.. wenn also jemand eine schnelle Lösung hat freu ich mich natürlich.
Momentan weiß ich auch nicht genau in welches Thema ich mich einlesen hätte müssen. Wenn mir jemand dieses nennen könnte dann freut es mich eben falls (auch wenn ich es erst später lesen kann). Einfach mal Serial1.print()/Serial1.read() und ReadFile()/WriteFile() wie in den Beispielen zu verwenden sieht zwar einfach aus.. aber mir scheint dass da noch eine ganze Menge mehr an Hintergrundwissen nötig ist (gerade in die FlowControl,DSR,XOFF, usw. Richtung)

Wieso legst du dich eigentlich so darauf fest, dass das alles in 50ms Intervallen geschehen soll? Generell kann man die serielle Schnittstelle so schnell Abfragen wie das Programm läuft. Man schaut ständig nach ob was da ist und kopiert das in ein Array um. Das Ende eines Strings markiert man mit einem CR oder LF. Wenn man dann im Programm auf Delays verzichtet hat man eigentlich keine Probleme dass der Puffer voll läuft. Das geht problemlos mit bis zu 500.000 Baud.

Code hier:
http://forum.arduino.cc/index.php?topic=329469.msg2273780#msg2273780
Für dich ist die read_serial() Funktion relevant. Den Puffer kannst du größer machen und dann mit dem empfangen String was anderes machen.

Hier gibt es auch ein C# Programm mit einer Serial Klasse falls dir das eher zusagt als C++:
http://forum.arduino.cc/index.php?topic=328502.msg2272535#msg2272535
Die Klasse kann man auch in einem anderen GUI verwenden oder einem Konsolen Programm. Damit dein Bluetooth Adapter von dem GUI gefunden wird brauchst du eventuell die GetComPorts() Methode aus Reply #19

Serenifly:
Wieso legst du dich eigentlich so darauf fest, dass das alles in 50ms Intervallen geschehen soll? Generell kann man die serielle Schnittstelle so schnell Abfragen wie das Programm läuft. Man schaut ständig nach ob was da ist und kopiert das in ein Array um. Das Ende eines Strings markiert man mit einem CR oder LF. Wenn man dann im Programm auf Delays verzichtet hat man eigentlich keine Probleme dass der Puffer voll läuft. Das geht problemlos mit bis zu 500.000 Baud.

Danke. Hier war mein Denkfehler. Jetzt eben hat sich der Knoten endlich gelöst. Mit "Das Ende eines Strings markiert man mit einem CR oder LF." funktioniert nun alles wunderbar. Hab mir iwie gedacht ich könnte immer alle 50ms mal Daten auslesen und das am besten so dass ich alle 50ms genau einen kompletten Datenstring bekomme. Aber den String einfach solange selber zusammen zubauen bis das Ende vom String gesendet wird ist um einiges praktischer.