Datenerfassung über 2 RS232 Schnittstellen
-
ja klar, das es ein mainthread gibts ist klar^^ aber zwei trhead syncornisieren ist besser als 3 ... und 2 thread zu verwenden für Com 1 +2 ist nicht unbedingt "sicher"...
Pseudo:
DWORD ThreadFunc (LPPARAM *p Data){ while(1){ //hier Warten bis Com1 ein commando schickt (singleobject) while(1){ //Com2 auf daten warten lassen und lesen, wenn fertig aus schleife springen } } }
-
ja klar, das es ein mainthread gibts ist klar^^ aber zwei trhead syncornisieren ist besser als 3 ... und 2 thread zu verwenden für Com 1 +2 ist nicht unbedingt "sicher"...
Pseudo:
DWORD ThreadFunc (LPPARAM *p Data){ while(1){ //hier Warten bis Com1 ein commando schickt (singleobject) while(1){ //Com2 auf daten warten lassen und lesen, wenn fertig aus schleife springen } } }
-
ja klar, das es ein mainthread gibts ist klar^^ aber zwei trhead syncornisieren ist besser als 3 ... und 2 thread zu verwenden für Com 1 +2 ist nicht unbedingt "sicher"...
Pseudo:
DWORD ThreadFunc (LPPARAM *p Data){ while(1){ //hier Warten bis Com1 ein commando schickt (singleobject) while(1){ //Com2 auf daten warten lassen und lesen, wenn fertig aus schleife springen } } }
-
ja klar, das es ein mainthread gibts ist klar^^ aber zwei trhead syncornisieren ist besser als 3 ... und 2 thread zu verwenden für Com 1 +2 ist nicht unbedingt "sicher"...
Pseudo:
DWORD ThreadFunc (LPPARAM *p Data){ while(1){ //hier Warten bis Com1 ein commando schickt (singleobject) while(1){ //Com2 auf daten warten lassen und lesen, wenn fertig aus schleife springen } } }
-
ja klar, das es ein mainthread gibts ist klar^^ aber zwei trhead syncornisieren ist besser als 3 ... und 2 thread zu verwenden für Com 1 +2 ist nicht unbedingt "sicher"...
Pseudo:
DWORD ThreadFunc (LPPARAM *p Data){ while(1){ //hier Warten bis Com1 ein commando schickt (singleobject) while(1){ //Com2 auf daten warten lassen und lesen, wenn fertig aus schleife springen } } }
-
ja klar, das es ein mainthread gibts ist klar^^ aber zwei trhead syncornisieren ist besser als 3 ... und 2 thread zu verwenden für Com 1 +2 ist nicht unbedingt "sicher"...
Pseudo:
DWORD ThreadFunc (LPPARAM *p Data){ while(1){ //hier Warten bis Com1 ein commando schickt (singleobject) while(1){ //Com2 auf daten warten lassen und lesen, wenn fertig aus schleife springen } } }
-
Was soll den der Quatsch? Ob ich nun einen oder zwei Threads synchronisiere ist glaub ich nicht der Mega-Aufwand, wenn man es konsequent durchzieht. Solche Konstrukte wie du da grad gepostet hast sind totaler Käse, weil du ja nicht weißt an welcher Stelle das Event als erstes ankommt. Er geht zwar davon aus das es in einer gewissen Reihenfolge vorliegt, nur wird genau das sein Problem sein warum es nicht funktioniert. Ich würde wie schon vorhin gesagt jede COM in einen Thread stecken und die Synchronisierungsmechanismen klar und strukturiert durchziehen. Dann kann man ja auch sehen in welcher Reihenfolge was wo ankommt. Außerdem hab ich nie behauptet das bei zwei Threads was sicherer ist...

-
hallo leute,
hab erst jetzt die ganzen Antworten gesehen!!
erstmal danke für eure Hilfe und ich werd versuchen die lösungsvarianten einzeln zu testen und dann die ergebnisse zu posten
-
wenn definitv klar ist, das Com 1 ne anfrage sendet, und com 2 auf die antwort wartet. und das konsiquent durchgezogen wird, werden events richtig ankommen?
wenn du jemand ne frage stellst bekommst ne antwort, oder bekommst du ne antwort ohne davor ne frage gestellt zu haben? du kannst ne frage stellen und es kommt keine antwort, gibts keine reaktion frägst evtl. nochmal^^ timeout..
-
BorisDieKlinge schrieb:
wenn definitv klar ist, das Com 1 ne anfrage sendet, und com 2 auf die antwort wartet. und das konsiquent durchgezogen wird, werden events richtig ankommen?
wenn du jemand ne frage stellst bekommst ne antwort, oder bekommst du ne antwort ohne davor ne frage gestellt zu haben? du kannst ne frage stellen und es kommt keine antwort, gibts keine reaktion frägst evtl. nochmal^^ timeout..
Wenn das so klar wäre würde es ja funktionieren. Sollche Anmerkungen "wenn definitiv klar ist" sollte man nie machen, wenn man auf perifere Geräte zugreift. Deine Annahmen sind zwar kausal, aber wenn du Windows eine Frage stellst, bekommst du nicht immer eine kausale Antwort drauf. Deshalb sollte man das so machen, denn es ist nicht sicher (eben wegen der Überschneidung durch die Abarbeitung der Message-Loop), dass diese Annahme (erst COM1 dann COM2) immer gilt. Somit muss man diesen, wenn auch nicht gewollten oder vermuteten Fall auch ausgrenzen.
Als Beispiel: ich hab eine Anwendung für eine Maschinensteuerung geschrieben. Dort war ein Aktor auszuwerten, dessen einzige Zustände "Anschlag links" oder "Anschlag rechts" sind. Jetzt wird einleuchten, dass wenn das Ding links anliegt, es nicht rechts sein kann und umgekehrt. Blöd war eben nur, dass das Umschalten einige wenige Millisekunden dauerte und wenn man genau dann abgetastet hatte, war keiner der beiden Zustände erreicht. Das kam zufällig alle 1000 Schaltvorgänge vor und das Programm hängte sich auf. Timeouts gingen hier nicht, da die Abfolge der Abfragen zeitlich sehr hintereinander lagen. Somit habe ich den eigentlichen Zustand "mittig" definiert, den es nach der Aussagenlogik so nicht gab. Und damit hatte ich das Problem im Griff.
-
Es ist ja so dass ich nicht davon ausgehen kann, dass ich über COM1 eine anfrage bekomme und COM2 gleich die Antwort, denn es könnte ja passieren, dass keine Antwort zurück kommt und deshalb die anfrage nochmal gestellt werden muss!!! ich bekomme folgendes ergebnis:
anfrage x
anfrage y
antwort x
anfrage z
antwort ypassiert es öffter, dass die hintereinander anfragen folgen, wird die antwort immer weiter nach hinten versetzt. Kommen jedoch mehrere Antworten hintereinander, so geht dies in die gegengesetzte richtung!!!
Man könnte ja nun warten bis sich das wieder einpendelt, jedoch sind die Zeiten die bei anfrage x und antwort x "gemessen" werden zu verschieden und haben nichts mehr mit der realität zu tun, da sie verfällscht werden !!
-
markus.z84 schrieb:
Es ist ja so dass ich nicht davon ausgehen kann, dass ich über COM1 eine anfrage bekomme und COM2 gleich die Antwort, denn es könnte ja passieren, dass keine Antwort zurück kommt und deshalb die anfrage nochmal gestellt werden muss!!! ich bekomme folgendes ergebnis:
anfrage x
anfrage y
antwort x
anfrage z
antwort ypassiert es öffter, dass die hintereinander anfragen folgen, wird die antwort immer weiter nach hinten versetzt. Kommen jedoch mehrere Antworten hintereinander, so geht dies in die gegengesetzte richtung!!!
Man könnte ja nun warten bis sich das wieder einpendelt, jedoch sind die Zeiten die bei anfrage x und antwort x "gemessen" werden zu verschieden und haben nichts mehr mit der realität zu tun, da sie verfällscht werden !!
meine Rede. Ist genau das, was ich vermutet habe. Deine Chance ist nur, jede COM in einen Thread zu stecken und sauber die Synchronisation durchzuziehen. Eventuell müsstest du cachen oder mit timeouts arbeiten, wenn dir nach einer gewissen Zeit die Daten nichts mehr nützen.