ReadFileEx funktioniert nicht richtig



  • Hallo,

    ich benutze zur asynchrionene Dateneingabe über USB um die Daten vom Treiber abzuholen ReadfileEx mit der Windows Overlap Strucktur. Ich übergebe readfilex einen Puffer dessen Daten dann in der Completionion routine wietrgeleitet werden.
    Doch leider kommen manchmal nicht alle daten die ich gesendet habe an. Diese Fehlenden Daten kommen aber dann beim nächsten senden von Daten an den PC mit. Das heißt Windows Puffert diese.
    Jetzt habe ich versucht herauszufinden wo meine Daten stecken. also habe ich mein Programm dort angehalten wo die Daten gefehlt haben und prompt waren die Daten auch in dem Puffer den ich ReadFileEx überegeben habe schon enthalten nur leider habe ich noch kein Event bekommen.

    Der Code:

    while(!ubThreadExit)
    {
    if (INVALID_HANDLE_VALUE != hRead)
    {

    // Empfangsevent?
    if (WAIT_IO_COMPLETION == WaitForSingleObjectEx(ov.hEvent, 500, true))
    {
    ReadFileEx(hRead, RxBuffer, 256, &ov, ReadFileIOCompletionRoutine);
    }
    }
    }

    meine Completition Routine siet folgendermaßen aus:

    VOID CALLBACK ReadFileIOCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped)
    {
    DWORD Error;
    unsigned long ulNBytesRead;

    if ((pUSBRxHandler) && (dwNumberOfBytesTransfered > 0))
    pUSBRxHandler(RxBuffer, dwNumberOfBytesTransfered, pUSBTag);
    }

    Hat irgend jemand eine Idee?

    MfG


  • Mod

    Ist ein Duplikat von diesem Thread und hat sich damit erledigt
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-165955.html



  • leider noch nicht. Zu frü gefreut nachdem ich erneut gestartet hatte trat das problem wieder auf

    ich hatte nur noch mal nen neuen thread eröffnet da die überschrifft nicht mehr gestimmt hatte mitlerweile.

    MfG



  • gibt es noch eine andere Möglichkeit der ausynchronen datenübergabe außer mit readfile.

    Mfg



  • Oh Mann Mann Mann... 🙂
    Wenn du nem Treibär sagst du willst 1000 Byte (Beispiel), dann kann der dir 1000 oder 100 oder 42 oder garnix schicken. So einfach ist das. Das ist keine Fehler, das ist halt so. Ein USB Port ist ja kein File, nen?

    Von daher ist das beobachtete Verhalten normal und kein Fehler, nen?
    Würde ich mal meinen.



  • lieber Hustbaer

    du hast das Problem nicht richtig verstanden.
    Ich sage meinem Treiber ich will 400 Bytes haben. Ich sende auf der anderen seite am PDIUSBD12D 400 Bytes ab und bekomme dies auch bestätigt, da das USB Protokoll dies bestätigt.
    Jetzt holt mein Readfilex vielleicht 200 Bytes ab und danach 100 und danach ist schluß. Ich starte aber readfileEx erneut. Jetzt wartet es auf erneute daten (eigentlich müssen ja noch 100 da sein) es bekommt aber keine Empfangsevent aber wenn ich im debuggmodus mir den puffer von Readfile anschaue sind die 100 Bytes schon enthalten ich hab nur noch kein event bekommen damit die completition routine gestartet wird.
    Wenn ich jetzt keine neuen Daten vom PDIUSB aus sende kommen die letzten 100 Bytes also nicht an.
    Dieses problem tritt aber nicht immer auf es wird nur manchmal ein Event vergessen. Ich konnte den Fehler noch nicht richtig reproduzieren. Wenn ich aber erneut 400 Bytes vom PDIUSB sende kommen dann 500 an weil Windows sich ja gemerkt hat das 100 Bytes noch nicht abgeholt wurden und diese auch noch im Puffer sind.

    Es ist auch nicht das letzte Event was mein programm vergisst sondern irgend eins oder mehrere in der mitte, denn wenn ich 400 Bytes sende vom PDIUSB werden dies in 64 Byte stücke aufgeteilt und gesendet wenn ich nun das letzte event vergessen würde müßte die empfange Anzahl immer ein vielfaches von 64 sein. Ist es aber nicht es fehlt immer ein vielfaches von 64 das heißt das letzte Event kommt immer und es werden diese date auch abgeholt nur halt die restlichen nicht.

    MfG



  • The ReadFileEx function ignores the OVERLAPPED structure's hEvent member. An application is free to use that member for its own purposes in the context of a ReadFileEx call.



  • ich weiß jetzt noch nicht wie mich das weiterbringen soll, was kann man mit diesem hevent flag anstellen oder was meinst du mit deiner Bemerkung

    MfG



  • Wenn das Event von ReadFileEx nicht benutzt wird macht es glaub ich wenig Sinn in WaitForSingleObjectEx auf das Event zu warten.



  • also man muß den tread ja in einen alartable wait state bringen damit die completition routine ausgeführt wird. Deshalb das WaitForSingleObjectEx wenn die Completition routine fertig ist setzt sie dann das event auf WAIT_IO_COMPLETION damit der tread weiter laufen kann.

    diese Diskusion hilft mir aber bei meinem Problem nicht weiter.

    MfG


Log in to reply