Ist es ein Timeout-Problem?
-
So, ich habe nun auch wieder ein Problem:
Ich sende von einem Mikrokontroller aus 29 Bytes an Daten.
Wenn ich alles schön mit Breakpoints durchgehe, dann erhalte ich mit meiner Software alle Bytes korrekt. Lasse ich den Mikrokontroller einfach laufen, dann erhält meine Software nur die ersten 8 Bytes! Schicke ich dann wieder die 29 Bytes, dann erhält er schon die ersten 16 Bytes. Beim nächsten Mal sind es dann 24, etc...! Ich vermute ja mal, dass es an einem Timeout liegt, weiss aber nicht, wie ich das herausfinden soll?!? Und logisch finde ich das auch nicht.
Zur Info: Ich lese jedes Byte einzeln(ReadFile).
Falls noch Unklarheiten da sind, dann bitte melden.
Und falls Anregungen oder Hinweise, dann auch.GetLastError() sagt, dass alles erfolgreich verlief und Hyperterminal empfängt auch alles korrekt.
-
[quote="Paul_C."]So, ich habe nun auch wieder ein Problem:
[\quote]
In der Regel sollte die Gegenstelle das Datenpacket mit einem ACK bestätigen. Du müsstest also auf die Antwort warten, bevor das nächste Packet gesendet wird.Leerst du auch immer schön den Buffer vor dem senden/empfangen? Nicht dass in den Buffern noch irgendwelcher Müll drinnen ist.
Vorschlag:
+ Versuch mal herauszufinden, ob eben ein ACK gesendet wird. -> Flusskontrolleproblem
+ Baue in deiner SendByte() - Methode ein Sleep ein und guck ob alles schön gesendet wird. ->Timeout/Flusskontrolleproblem
+ Protokolliere die Daten (gesendete/empfangene)
+ Protokolliere die gesamte Anzahl an gesendeten/empfangen Daten.
-
Meinst du das Leeren mittles PurgeComm? Momentan mache ich das ein Mal wenn der Thread gerade gestartet wird.
Sonst ist das Testen ein wenig schwierig, denn, sobald ich alles anhalte und zusehe, wie Byte für Byte gesendet wird, dann funktioniert es ja!
Nur wenn ich alles laufen lasse, dann kommt das oben beschriebene Phänomen, dass, je öfter ich die 29 Bytes wiederholt sende, ich dann auch N*8 Bytes empfange.
Anzeigen lasse ich mir die empfangenen Bytes momentan in einer Listbox.
Die gesendeten sehe ich dann im Debugger des Mikrokontrollers.
-
Ok, ich habe nun weiter getestet, es scheint so, als ob die Daten doch vorhanden sind. Nur weiss ich nicht wie ich daran komme.
Folgendes: Ich warte momentan mit WaitCommEvent() auf Daten, die ankommen.
(Ich mache das alles non-overlapped). Dann lese ich mit ReadFile ein Byte aus.
In der Zwischenzeit scheinen wohl mehrere Bytes angekommen zu sein. Aber ich komme nicht so schnell mit dem Lesen mit. Denn wenn ich nach den 8 Bytes, die ich ja problemlos empfange, einen Breakpoint setze und den Mikrokontroller irgendwas senden lasse, dann liest meine Software mir aber das 9 Byte von den Daten davor!
Gibt es denn nicht dann einfach die Möglichkeit, den internen Puffer solange zu lesen bis er leer ist?
-
Paul_C. schrieb:
Gibt es denn nicht dann einfach die Möglichkeit, den internen Puffer solange zu lesen bis er leer ist?
ReadFile() ist die mir einzig bekannte Methode, um Datenbytes aus dem Buffer zu lesen.
Mit cbInQue der Struktur COMSTAT kann man prüfen, wieviele Bytes im Buffer verfügbar sein. DANN am besten diese Anzahl Bytes mit ReadFile() auslesen (nur jeweils ein Byte aus dem Buffer lesen ist nich effizient).
-
Ah,ja, das hört sich gut an. Habe mittlerweile in einer Endlosschleife mit ReadFile gelesen und weiss, dass die Daten definitiv da sind.:)
Danke. Ich melde mich, wenn ich weitere Probleme habe.
-
Paul_C. schrieb:
Ah,ja, das hört sich gut an. Habe mittlerweile in einer Endlosschleife mit ReadFile gelesen und weiss, dass die Daten definitiv da sind.:)
Danke. Ich melde mich, wenn ich weitere Probleme habe.Schau dir noch die MSDN Seite zu ReadFile an - da kann man mit dem COMMTIMEOUT-struct (oder so ähnlich) die Timeouts setzen. Je nach Wert verhält sich die Methode anders.
Habe die Doku schon 100x gelesen, verstehe es aber immer noch nicht ganz. argh
-
Geht mir auch so. Da habe ich heute auch mal wieder drin gelesen. Aber irgendwie verwirrend mit den Multipliern.;)
Komme morgen wohl erst wieder zum Testen. Werde dann mal schreiben, was sich ergeben hat.