Guten Morgen, ich bin gerade dabei ein kleines Programm zu schreiben, mit welchem ich Daten via RS232 empfangen und senden kann. Dies funktioniert auch "fast" Reibungslos;). Nun will ich einige Ausnahmen mit Hilfe von "try" und "catch" abfangen. Nun zu meinem Problem. Sobald die Ausnahme "TimeoutException" zum ersten mal auftritt, läuft alles wie gewollt und er springt in die "catch-Anweisung". Jedoch kommt er da nicht mehr raus. D.h. solbald ich etwas senden möchte, hängt sich das Programm auf. Ich vermute ich muss die TimeoutException löschen, aber wie? Über schnelle Hilfe würde ich mich freuen. Danke! Programmauschnitt: try { String ^ComPort=option->comboBox1->SelectedItem->ToString(); String ^BaudRate=option->comboBox2->SelectedItem->ToString(); BaudRate2=Convert::ToInt32(BaudRate); SerialPort^ serialPort = gcnew SerialPort(ComPort, BaudRate2,Parity::None ,8, StopBits::One); serialPort->Open(); serialPort->DiscardInBuffer(); serialPort->DiscardOutBuffer(); serialPort->Write("LO\r"); Sleep(10); serialPort->ReadTimeout = 1000; String ^Test=serialPort->ReadLine(); DateTime zeit=DateTime::Now; richTextBox1->AppendText(zeit+"\t"+"LO"+"\t"+Test+"\r"); serialPort->Close(); } catch(Exception^ e) { //this->richTextBox1->AppendText("Test"); MessageBox::Show("No incomming Data!","Exception"); }
:
Verschoben durch User
Ich kenn die Implementierung von SerialPort nicht, aber gefühlmäßig würde ich den Sendepuffer leeren.
Hallo, ich kenne mich mit Visual C++ nicht aus aber ich vermute mal dass es daran liegt, dass Dein Programm ständig nichts empfängt und demnach immer auf Timeout läuft. D.h. aus der Empfangsroutine gar nicht mehr raus geht. Warum lässt Du überhaut die Routine für die serielle Schnittstelle bei Empfang in den Exception-Handler laufen? Entscheide dies doch vom Anwenderprogramm ob Du eine Fehlermeldung gibst. Nur im Anwenderprogramm weisst Du doch ob Du Daten zurück erhalten musst oder nicht. Ich habe mir mal eine Klasse für die serielle Schnittstelle geschrieben. Im Anwenderprogramm gehe ich auf Empfang. Wenn keine Daten zur Verfügung stehen dann gebe ich eine Fehlermeldung aus oder arbeite normal weiter. Sieht dann so aus.
1 | string Ergebnis = Waage1->ReceiveData(); |
2 | if(Waage1->GetLastError() == CE_OK) |
Viele Grüße Andreas
Das ist nicht C++, sondern die MS-Perversion namens "Managed C++", die auf dem .Net-Geraffel aufsetzt. Die verwendeten Komponenten dürften sich in anderen .Net-Sprachen wie C# und VB.Net ähnlich verhalten, vielleicht hilft ja eine Suche nach "serialport .net c#" für weitere Erkenntnisse.
Jens schrieb: > Nun will ich einige Ausnahmen mit Hilfe von "try" und "catch" abfangen. > Nun zu meinem Problem. Sobald die Ausnahme "TimeoutException" zum ersten > mal auftritt, läuft alles wie gewollt und er springt in die > "catch-Anweisung". Jedoch kommt er da nicht mehr raus. D.h. solbald ich > etwas senden möchte, hängt sich das Programm auf. Wie ist das zu verstehen. Dein Programm kann nicht in der Exception behandlung hängen. Da ist keine Schleife. > Programmauschnitt: > > try > { > String ^ComPort=option->comboBox1->SelectedItem->ToString(); > String ^BaudRate=option->comboBox2->SelectedItem->ToString(); > BaudRate2=Convert::ToInt32(BaudRate); > SerialPort^ serialPort = gcnew SerialPort(ComPort, > BaudRate2,Parity::None ,8, StopBits::One); warum legst du das SerialPort Objekt dynamisch mittels gcnew an? Wir reden hier von C++. Alles was nicht dynamisch angelegt werden muss, sollte man auch nicht dynamisch erzeugen, sondern als normales Objekt > serialPort->Open(); Du öffnest den Port > > serialPort->Close(); zum Close kommt es aber erst dann, wenn keine Exception auftritt. D.h. mit ein wenig Pech, hängt der Port immer noch geöffnet nach deiner Exception rum und generiert munter weitere Timeouts, bis es vom Garbage Collector entsorgt wird. Mit einer stink normalen Objekt-Allokierung wäre das nicht passiert. -> den try / catch Block enger machen, so dass er wirkich nur das überwacht, was du beabsichtigst und du auch Gelegenheit hast, hinter dir aufzuräumen. > Das ist nicht C++, sondern die MS-Perversion namens "Managed C++" .Net ist ja schön und gut (die Lib ist wirklich gut gemacht). Aber dieses Managed C++ ist bäääh. Wenn man schon .Net benutzen will, dann auch mit den Sprachen, die von vorne herein dafür ausgelegt sind. Leider verleitet dieses Managed C++ dazu, zu denken dass in C++ jetzt alles viiiieel einfach ist. Genau das Gegenteil ist der Fall.
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.