SetCommMask() bereitet Kopfschmerzen
-
Hallo,
ich habe mal wieder ein Problem mit meiner Kommunikation über den seriellen Port. Und zwar habe ich, für die, die es noch nicht wissen (;)) meinen PC mit einem Mikrokontroller verbunden. Diese beiden senden ständig Daten hin und her.
Ich benutze zum Lesen und Schreiben jeweils einen Thread -ReaderThread und WriterThread. In dem ReaderThread nutze ich SetCommMask() umd mit WaitCommEvent() auf ankommende Daten zu warten. Mein Problem aber besteht darin, dass während der ReaderThread sich in diesem Wartezustand befindet mein WriterThread nicht senden kann. Da steigt er bei der WriteFile()-Funktion einfach aus. Kommentiere ich SetCommMask aus, dann funktioniert das Senden.
Empfange ich aber vom Mikrokontroller den Befehl, Daten zurück zusenden, dann funktioniert auch das! Das liegt vermutlich daran, dass das Programm aus dem Wartezustand gekommen ist und schneller sendet, bevor er sich genau dort wieder befindet.Jemand eine Idee, wie ich weiter vorgehen soll? Ich nutze non-overlapped-Kommunikation.
Schönen Gruß.
Paul.
-
Warum setzt du SetCommMask immer wieder? Einmal beim initalisieren, wenn du den Port öffnest sollte doch reichen, oder?
-
Am Anfang des ReaderThreads benutze ich SetCommMask(). Dann läuft der Thread in einer Schleife ab, solange ich mit dem Mikrokontroller verbunden bin.
Also, rufe ich die Funktion nur einmal auf.
-
Dann kann es ja nur noch an den mit SetCommMask gestzten Werten liegen. Lies doch mal vorher mit GetCommMask die gesetzten Werte aus, dann siehst du zumindest die Werte, die ja zu funkrionieren scheinen und kannst dich langsam zu settings vortasten, die du selber setzen kannst.
-
Ich will ja im ReaderThread, dass der auf EV_RXCHAR reagiert und das funktioniert auch. Jedoch habe ich dann das beschriebene Problem mit dem Schreiben. Ich habe auch mal alle möglichen Einstellungen ausprobiert, doch das funktioniert einfach nicht. Ich kam auch auf die Idee, im WriterThread jedesmal wieder ein SetCommMask() zu nutzen, aber da bricht er dann auch ab.
-
Habe einfach mal versucht, wenn ich schreiben möchten, mit GetCommMask() die aktuelle Einstellung auszulesen, aber da bricht er mir auch schon ab?!
-
Da kann ich Dir leider erstmal nicht Weiter helfen. Hast du schonmal mit GetLastError gecheckt, warum es denn Schief geht?
Vermutich blockiert das Warten auf ein Event den gesammten Port. Muß wirklich beides gleichzeitig passieren?
-
Ja, muss, da ich mit meiner Software einige Daten, Variablen der Software des Mikrokontrollers ändern soll. GetLastError() sagt immer nur, dass es erfolgreich war.
ABER ich habe nun doch nochmal versucht, overlapped-Kommunikation zu benutzen und tata: Es klappt! Dabei hätte ich schwören können, dass ich das so schon mehr als einmal ausprobiert habe!
Nun kann ich senden und empfangen und alles klappt.
Danke dennoch für deine Ratschläge und Gedanken. Es kann immer mal wieder ungemein helfen, wenn eine weitere Person Ideen einbringt. Man denkt schließlich auch nicht immer an alles.
Schönene Gruß,
Paul.