Stream Timeout?



  • Hi everyone

    Ich verwende gerade zum Auslesen eines Gerätes, das an einer RS232-Schnittstelle angeschlossen ist, einen seriellen Stream aus der LibSerial. Das sieht dann in etwa so aus:

    char c;
    do {
    	stream >> c;
    	buffer.append(1, c);
    } while (c != ETX);
    if (useBCC) {
    	stream >> c;
    	buffer.append(1, c);
    }
    

    Das klappt soweit wunderbar, es stellt sich mir nur ein Problem: Es kann gut vorkommen, dass das gerät 'mal keine Antwort gibt (sei es nun ausgeschaltet, defekt oder gerade anderwärtig beschäftigt). Gibt es auf meine Anfrage nicht während höchstens 1500ms eine Antwort, ist das eine Protokollverletzung und die Funktion muss abgebrochen werden.

    Meine Frage ist nun: Wie kann ich so einen Timeout in C++ realisieren? Muss ich dabei auf Unix-Signalfunktionen zurückgreifen (was ich, wenn möglich, lieber vermeiden würde) oder gibt es da eine allgemeine C++ -Bibliothek für? Ich denke dabei z.B. an eine Timeout-Exception, sodass ich meine Streamanfrage mit einem try-catch schützen könnte...

    Besten Dank schon im Voraus für jede Hilfe und beste Grüsse
    Kessi



  • Hallo

    Das must du schon in der Doku deiner Schnittstellen-Library nachschauen. C++ kennt weder serielle Schnittstellen noch Timeouts.

    bis bald
    akari



  • Hallo Kessi,

    der Timeout muss in dem unterliegenden streambuf realisiert werden. Wenn das eine fertige Lib ist, so gibt es sicher eine Möglichkeit das einzustellen. Schlägt der Timeout zu, so wird der streambuf wahrscheinlich ein EOF zurückgeben und der Aufruf

    stream >> c;
    

    kommt mit Fehler zurück; d.h. der stream steht auf fail; dies musst Du also noch abfragen. Im Prinzip so oder ähnlich

    char c;
    do {
        if( stream >> c )
            buffer.append(1, c);
        else {
            // Fehler; evt. Timeout
            break;
        }
    } while (c != ETX);
    if (useBCC && stream >> c) {
        buffer.append(1, c);
    }
    

    Was für eine Library zum Auslesen der RS232 benutzt Du?

    Gruß
    Werner



  • Das wäre natürlich ideal 🙂 . Leider habe ich Nichts entsprechendes gefunden...

    Ich benutze LibSerial .

    Greetz
    Kessi



  • Hmm naja so ne dolle Lib scheint es nicht zu sein:

    void LibSerial::SerialStream::Open (const std::string filename, /*...*/)
    

    😃 Entweder hat doxygen versagt, oder es handelt sich um eine const. kopie von filename. Das ist relativ sinnlos 😛 Man sollte dann schon eine const-Ref übergeben 😃



  • Nööö, doxygen hat nicht versagt, das ist effektiv im Code auch so, habe nachgesehen. Naja, mit solchen Kleinigkeiten könnte ich ja noch leben, wenn das Ding einen TimeOut unterstützen würde. Das tut es allerdings, wenn ich das recht sehe, explizit nur wenn man die "SerialPort"-Klasse verwendet anstelle von "SerialStream".

    Diese arbeitet mit Read- bzw. ReadByte-Funktionen, wobei man optional einen TimeOut angeben kann. Umso verdutzter bin ich, dass das bei der Implementation als IOStream nicht gemacht wurde 😕 ...

    Wenn ich deine Anmerkung richtig verstehe, bist du allerdings ohnehin nicht sehr von dieser Library überzeugt. Kennt denn jemand evtl. Alternativen dazu, mit denen ich einen Stream zum ansteuern der seriellen Schnittstelle verwenden kann?

    Alles in allem ist das Ding nämlich recht elegant, muss ich sagen, wenn denn nur ein TimeOut unterstützt würde...

    Thx schon 'mal und greeetz
    Kessi


Anmelden zum Antworten