ReadFile() + serielle Schnittstelle



  • hi,

    ich versuch was von der seriellen Schnittstelle zu lesen, das Problem: ReadFile wartet solang, bis ein Zeichen da is. Ich will aber das ReadFile wieder zurückkehrt wenn kein Zeichen da is. Wie mach ich das??? 😕
    Danke für jede Antwort!



  • CreateFile mit OVERLAPPED-Structur einrichten, einen Event erzeugen der auftritt wenn ein zeichen eingetroffen ist. Auf dieses event wartest Du am besten in einem zweiten Thread, mit WaitForSingleObjekt(...).



  • Geht natürlich so wie Carry es beschrieben hat.
    Ist aber ziemlich aufwendig und kompliziert (zumindest bei mir war es beim ersten mal so).

    Einfacher finde ich, die Timeoutzeiten zu setzen. Wenn dann kein Zeichen vorhanden ist, kehrt ReadFile zurück

    LPCOMMTIMEOUTS CommTimeouts;
    
          GetCommTimeouts(iCommId,CommTimeouts);
          CommTimeouts->WriteTotalTimeoutMultiplier=1;
          CommTimeouts->WriteTotalTimeoutConstant=iSendTimeoutLength;
          CommTimeouts->ReadIntervalTimeout=10;
          CommTimeouts->ReadTotalTimeoutMultiplier=1;
          CommTimeouts->ReadTotalTimeoutConstant=iReceiveTimeoutLength;
          SetCommTimeouts(iCommId,CommTimeouts);
    


  • Na, wenn das mal gut geht. CommTimeouts hat garkeinen Speicher!



  • das mit dem zweiten thread ist gar nicht so schwer, es war mein erstes mfc projekt, und ich habe nur die möglichkeit des selbsstudiums gehabt, und doch hat es schnell funktioniert. jetzt verwende ich diese form natürlich unter winapi. es hat eben den vorteil, dass im hintergrund zu jeder zeit zeichen vom port eintreffen können.



  • Das ist alles sehr leicht gesprochen doch für jemanden der in C++ nicht super routiniert ist ist das ein endloses Theater.

    Hat jemand vielleicht ein wirklich übersichtliches und pragmatisches Beispiel zu diesen Themen ...?

    Vielen Dank...
    und Grüße aus Wien...
    lookover.at



  • Schau mal hier:

    http://www.codeproject.com/KB/system/serial.aspx

    Entweder du verwendest diese fertige Klasse, oder wenn du's selbst machen willst, dann lies dir einfach mal den Text durch. Da steht einiges drin, was für die serielle Kommunikation interessant und wichtig ist.



  • _matze schrieb:

    Da steht einiges drin, was für die serielle Kommunikation interessant und wichtig ist.

    da auch: http://msdn.microsoft.com/en-us/library/ms810467.aspx
    hab ich eigentlich schon mal gesagt, dass serielle kommunikation unter win32 unnötig komplex ist. ich glaub schon...
    🙂



  • +fricky schrieb:

    hab ich eigentlich schon mal gesagt, dass serielle kommunikation unter win32 unnötig komplex ist. ich glaub schon...
    🙂

    Ja, das wurde hier im Forum (nicht nur von dir) schon ein, zwei mal erwähnt. 😉

    Da gibt es halt ein paar Stolperfallen. Aber wenn's einmal flutscht, dann geht's. Ich hab in einem meiner Projekte auch mal ne eigene Kommunikation geschrieben, und nach anfänglichem Zähne-in-den-Tisch-beißen gings dann aber ganz gut. Und die läuft auch zuverlässig.



  • _matze schrieb:

    +fricky schrieb:

    hab ich eigentlich schon mal gesagt, dass serielle kommunikation unter win32 unnötig komplex ist. ich glaub schon...
    🙂

    Ja, das wurde hier im Forum (nicht nur von dir) schon ein, zwei mal erwähnt. 😉
    Da gibt es halt ein paar Stolperfallen. Aber wenn's einmal flutscht, dann geht's. Ich hab in einem meiner Projekte auch mal ne eigene Kommunikation geschrieben, und nach anfänglichem Zähne-in-den-Tisch-beißen gings dann aber ganz gut. Und die läuft auch zuverlässig.

    ja, aber trotzdem müsste man den win32-rs232-apidesigner ohrfeigen. normalerweise bräuchte man, ausser CreateFile und CloseHandle zum öffnen und schliessen, nur vier lächerliche funktionen:
    - eine zum konfigurieren der rs232
    - eine zum schreiben
    - eine zum lesen
    - eine zum abfragen des bufferstatus (wieviel man senden darf bzw. wie viel empfangen wurde)
    🙂


Anmelden zum Antworten