TimeoutException unter Visual C++ 2008

Gast #1764605
Lesenswert?
• ▲
▼
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");
}
Gast #1764737
Lesenswert?
• ▲
▼
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
#1764905
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.