Hallo,
ich möchte ein Programm schreiben das Daten über die RS232 an einenen
Prozessor sendet und dann auf die Antwort wartet. Dann erst soll das
Programm weiter machen.
Ich habe bereits ein Programm was Daten sendet und auch empfangen kann.
Über 'serialPort1_DataReceived()' inkl. Threadsicherer Verarbeitung
klappt das ganze auch soweit. Nur bin ich jetzt mit meinem
(Anfänger)-Latein am Ende.
Ich möchte im Programm sicher stellen, dass die Antwort auf meine
Anfrage auch gekommen ist, bevor ich weiter mache.
Es wird wohl irgendwie über Treads gehen. Nur wie kann ich den Thread in
dem alles läuft anhalten?
Der Ablauf soll in etwa so sein:
1) serialPort1.Write("Hallo");
2) (Warten auf Antwort in 'serialPort1_DataReceived()')
3) Antwort auswerten
4) if(Antwort == ok)
serialPort1.Write("123");
5) weiter mit 2)
Zur Zeit schreibe ich die Anfragen in einer Funktion untereinander weg
und werte sie in DataReceived() aus.
Nur sende ich ja die Anfragen hintereinander weg. Und das soll nicht
sein.
Kann mir da jemand weiterhelfen.
Danke und Grüße
Tobias
Thread ist schon richtig. Dann musst du zuerst ein Event registrieren, also der SerialPort komponente bekannt geben, welches Event das Empfangs-Event ist. Und dann im Thread einfach WaitOne() mit diesem Event benutzen. Dann bleibt der Thread da stehn und macht erst weiter, wenn das Event eintritt. Am sinnvollsten nimmt man dafür ein Autoreset Event.
Hallo Christian, das klingt ja ganz einfach und genau nach dem was ich suche. Nur wie mache ich das Code-Technisch? Vom logischen verstehe ich deine Antwort zwar, kann sie aber leider nicht umsetzen :-( Kannst Du mir da noch ein wenig unter die Arme greifen? Tobias
Uff....also Beispielcode hab ich keinen. Einer meiner Hiwis macht das momentan für einen CAN-Adapter von IXXAT. Da guck ich immer mal, wie das geht. Zuerst solltest du einfach einen Thread erstellen, wie, steht ja in der MSDN Hilfe. Dann musst du deine Serialport-Klasse hernehmen, wenn´s die aus dem .NET Framework ist, gibts ja auch die Anleitung im MSDN. Da halt beim Initialisieren das Event registrieren. Das gings mit dem AutoReset Event. Such halt mal nach den Begriffen in der MSDN Hilfe. Da findest du immer den Beispielcode. im Thread dann einfach WaitOne() aufrufen, als Übergabeparameter das Event. Viel mehr kann ich dir leider nicht sagen. Vielleicht solltest du erst mal einen ganz einfachen Thread programmieren, und z.b. mit Thread.Sleep(2000) alle 2000ms irgend ne Meldung oder sowas erzeugen, damit du den Mechanismus verstehst.
Es geht moeglicherweise noch etwas einfacher. Ich habe das eben so
geloest, dass ich mir in Thread1 eine Methode definiert habe:
private string serialPort1.sendCommand()
Im Thread dieser Methode wird an den serialPort ein Textstring
geschickt, und laengstenfalls zwei Sekunden auf Antwort gewartet;
Rueckgabewert ist entweder die Antwort des Ports oder eine
Fehlermeldung.
Jetzt ists aber so, dass die Variable, die die Antwort des SerialPorts
enthalten soll, Teil von Thread1 ist, waehrend der serialPort einen
eigenen Thread (Thread2) darstellt. Aergerlicherweise wird das Event von
Thread2 erst dann in die Variable geschrieben, wenn Thread1 nicht mehr
wartet. Ich wollte aber, dass Thread2 die Antwort direkt in die Variable
schreibt, sobald sie kommt. Die Loesung ist die Befehlszeile:
Application.DoEvents();
Damit haelt Thread1 an und arbeitet alle anderen Events ab, bevor beim
urspruenglichen Event weitergemacht wird. Komplett sieht die Loesung so
aus:
private string serialPortSendCommand(SerialPort p, String str) {
int timer = 0;
p.Write(str);
while(answer == "" && timer < 40) {
System.Threading.Thread.Sleep(50);
Application.DoEvents();
timer++;
}
if (timer > 30) return "Error! No Signal!";
else return answer;
}
wozu überhaupt threads?
serialPort1.Write("Hallo");
serialPort1.Read();
fertig. Die Timeouts kann ma ja auch festlegen - ist das zu einfach oder
überseh ich was?
Peter II schrieb: > wozu überhaupt threads? > > > serialPort1.Write("Hallo"); > serialPort1.Read(); > > fertig. Die Timeouts kann ma ja auch festlegen - ist das zu einfach oder > überseh ich was? Das ist die einfachste Variante. Eleganter ist das über Events zu lösen, da das ganze Programm da nicht an einer Stelle wartet. Threads nimmt man eher bei Asyncronen Aufgaben.
Samuel K. schrieb: > Das ist die einfachste Variante. Eleganter ist das über Events zu lösen, > da das ganze Programm da nicht an einer Stelle wartet. man kann aber das senden und empfangen komplett im Thread machen. damit ist auch beim Senden die GUI noch aktiv.
das geht auch. Ich persönlich würde es über Events machen und eine Variable setzen, ob die Anfrage bestätigt worden ist oder nicht. Bei Events ist die GUI übrigens auch noch aktiv.
Samuel K. schrieb: > Bei Events ist die GUI übrigens auch noch aktiv. Dann hast du das Problem aber auch noch beim Senden. Das Blockiert bis alle datenn in den Puffer geschrieben sind.
Das dauert aber wenn man nur Steuerbefehle sendert nicht so lang.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.