Forum: PC-Programmierung TimeoutException unter Visual C++ 2008


von Jens (Gast)


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");
}

: Verschoben durch User
von Sven P. (Gast)


Lesenswert?

Ich kenn die Implementierung von SerialPort nicht, aber gefühlmäßig 
würde ich den Sendepuffer leeren.

von Andreas (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.