mikrocontroller.net

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


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
  string Ergebnis = Waage1->ReceiveData();
  if(Waage1->GetLastError() == CE_OK)

Viele Grüße
Andreas

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.