none
Zeitüberschreitung beim lesen von der RS232 RRS feed

  • Frage

  • Hallo,

    ich habe die ganze Zeit noch mit dem Studio 6.0 gearbeitet und bin nun auf die Express Version von C++
    gewechselt. Für meine Arbeit benutzten wir häufig die RS232 Schnittstelle und ich habe schon
    einiges hinbekommen nur habe ich jetzt noch ein Problem.
    Ich möchte 2 Bytes Senden und warte dann auf eine Antwort von 4 Bytes. Das habe ich auch mit dem
    unteren Code gelöst.

    array<Byte>^ buffer = gcnew array<Byte>(4);
    array<unsigned char>^ b = gcnew array<unsigned char>(4096);
               
                int a=0;
                int data=0;
                int comand=0xabcd;
               
                buffer[0]=comand>>8;
                buffer[1]=comand;
                               
                com1->Open();           
                com1->Write(buffer,0,2);    // Comand schreiben
               
                while(com1->BytesToRead==0);

                a=com1->BytesToRead;        //

                if(a!=4)                    // Wenn nicht fehler anzeigen
                    MessageBox::Show("Keine richtige Antwort");
                else                        // Wenn ja werte einlesen und zu Data zusammenfügen
                {
                    com1->Read(b,0,4);
                    data=data+b[2];
                    data=data<<8;
                    data=data+b[3];
                    textBox1->Text=data.ToString();
                }
                com1->Close();

    Ich prüfe auch gleich ob die richtige Anzahl Bytes gesendet wurden nur jetzt mein Problem.
    Ich möchte es so ändern, dass wenn nach einer bestimmten Zeit keine Daten gesendet wurde
    ein Fehler ausgegeben wird und das Programm aus der Routine springt, sonst hängt sich mein
    Programm auf.  Ich habe schon die ReadTimeOut auf 1sec. und es einfach mit einem read Befehl versucht und gehofft das er dann automatisch nach der Zeit abbricht aber nichts passiert.
    Wie kann ich den dieses Problem lösen.
    Wichtig ist nur das nach dem Senden meiner Daten das Programm nach einer festen Zeit ein
    Fehler meldet, damit es sich nicht aufhängt.

    MFG
    Sep.

    Donnerstag, 26. Februar 2009 08:38

Antworten

  • Hallo Sep,

    packe Deinen Code in einen try catch Block. Wenn innerhalb des ReadTimeouts Intervalls keine Antwort kommt wird eine

    "System.TimeoutException" ausgelöst. Entweder fängst du nur diese oder generell alle Exceptions ab.


    Vielleicht so:

    try
    {
         com1->Open();            
         com1->Write(buffer,0,2);    // Comand schreiben
                
         while(com1->BytesToRead==0);

               a=com1->BytesToRead;        // 

          if(a!=4)                    // Wenn nicht fehler anzeigen
               MessageBox::Show("Keine richtige Antwort");
          else                        // Wenn ja werte einlesen und zu Data zusammenfügen
          {
                com1->Read(b,0,4);
                data=data+b[2];
                data=data<<8;
                data=data+b[3];
                textBox1->Text=data.ToString();
          }
          com1->Close();
    }

    catch(Exception ^)       //alle Exceptions abfangen.
    {
        MessageBox::Show("Keine richtige Antwort");
        com1->Close();
    }

    Gruss
    Frank

    Samstag, 28. März 2009 18:36