Problem with OVERLAPPED structure



  • da drauf kann ich mich halt nicht verlassen da ich genau weiß wieviele daten schon an den pc gesendet wurden über das PDIUSBD12D und dieser Chip mir die Kommunikation auch bestätigt das heißt wenn ich statts 400 nur 272 empfange und beim nächsten mal dann 528 dann muß windows die daten intern gepuffert haben und mir keni event gegeben haben.

    Jetzt ist halt die frage wie ich windows dazu bringe mir wirklich alle events zu geben.

    MfG Maik Hänig


  • Mod

    Das habe ich doch schon geschrieben. Du kannst Dich einfach nicht darauf verlassen, dass immer 400 Byte in einem Stück gelesen und geschrieben werden.
    Wie intern gepuffert wird weißt Du eben doch nicht. Welche physikalischen Blöcke intern verwendet werden weißt Du nicht!

    Woher weißt Du das ReadFle eben nicht doch wieder Daten liefert nachdem du 272 Zeichen empfangen hast. Was passiert wenn Du einfach nochmal ReadFile ausführst?
    Diese Antwort muss ich überlesen haben, denn gestellt hatte ich diese Frage schon!

    Also bleibt Dir nur übrig ein entsprechendes Protokoll zu verwenden. Also immer eben 400 Bytes zu lesen und die Verarbeitung erst zu beginnen wenn diese eben voll sind.
    Ohne solche Protokolle wirst Du nicht weit kommen. Es gibt natürlich auch noch intelligentere Protokolle aber das wirst Du selber wissen.



  • wenn du oben den Code ankuckst siehst du das dieses Readfile von einer while schleife umgeben ist, das heißt das readfile wird sofort wieder ausgeführt. Oder meinst du das readfile in de completition routine nochmal auszuführen.

    Mir würde es ja nix ausmachen wenn die restlichen Daten die zu den 400 Fehlen etwas später kommen würden. Aber sie kommen halt erst mit dem nächsten richtigen empfangsevent.

    Das heißt wenn später in der richtigen applikation keine neuen daten gesendet werden und einmal welche Fehlen wird das dann als Fehler erkann und es wird eine neue übertragung ausgefürt dort kommen dann ja natürlich zuviele Daten an so dass man schon 2 Fehlversuche hat deshalb ist es ja einfacher das Problem lösen kann.


  • Mod

    Korrekt! Deine Schleife müsste funktionieren.
    Dann würde ich das Problem in dem Device sehen, der verwendet wird.

    Nur noch eine Frage am Rande: Du verwendest einen Manual Reset Event, und sonst wartet auf diesen Event auch niemand?



  • ich verwende keinen manuellen reset sollte ich das tun?

    ich verwende als treiber den windows usb smaple treiber aus dem ddk.

    und das device ist ein PDIUSBD12D das aber die daten als gesendet bestätigt, da es ein interruppt auslöst wenn die daten gesendet worden.

    MfG Maik


  • Mod

    Manual Reset is OK! Probleme gibt es mit AutoReset, wenn eben mehrfach evtl. WaitForSingleObject ausgeführt wird.

    Zu dem Device und dem Treiber kann ich nicht sagen.

    Versuch es doch mal in einer nntp Gruppe:
    microsoft.public.development.device.drivers
    oder evtl.
    microsoft.public.win32.programmer.kernel

    Evtl. ist den Jungs schon so etwas untergekommen.



  • wenn der fall eintritt und ich zu wenig daten bekommen und ich in den Puffer dem ich dem Readfile übergebe hinein schaue sind die Daten schon enthalten aber ich habe noch kein Event bekommen.

    MfG Maik


  • Mod

    Jetzt verstehe ich gar nichts mehr. Welcher Puffer?

    Du gibst einen Leseauftrag. Dieser returniert und sagt Dir es wird ein Event gesetzt wenn Daten da sind, in der entsprechenden OVERLAPPED Struktur steht auch wie viele Daten übertragen wurden.

    Es wird keinen neuen Event geben ohne das ReadFile neu aufgerufen wird. Denn erst ReadFile setzt den Event zurück und nun kann der Mechanismus von vorne losgehen.

    Jetzt fällt mir gerade was an Deinem Code auf!
    Du prüfst ja gar nicht den Rückgabewert von ReadFile!!!
    Nur wenn ReadFile 0 returniert UND GetLastError ERROR_IO_PENDING returniert darfst Du GetOverlappedResult aufrufen.

    Ansonsten hast Du ja die Daten!
    Liegt hier Dein Fehler!



  • also ich fasse nochmal zusammen

    Ich habe jetzt folgenden thread:

    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);
    }

    Jetzt tritt der Fehler auf das manchmal nicht 400 Bytes ankommen aber die Fehlenden beim nächsten event mit.
    Wenn ich nun nachdem die Bytes fehlen im debugger opause mache sind die fehlenden daten schon im RxBuffer (Variable wird Readfile als Buffer übergeben)
    ich bekomme halt nur kein Empfangsevent damit die Readfile Completition Routine aufgerufen wird

    Achso in der anderen version vom ersten Thread ist der selbe Fehler und da habe ich deinen Rat befolgt mal den Rückgabewert von Readfile gefprüft:

    Error = ReadFile(hRead, RxBuffer, 256, &ulNBytesRead, &ov);
    if ((0 == Error) && (ERROR_IO_PENDING != GetLastError()))
    {
    pUSBRxHandler(RxBuffer, ulNBytesRead, pUSBTag);
    }

    aber es ändert sich nix der betritt dieses if auch nicht

    MfG Maik



  • ich hab jetzt noch das writefile nach writefileEx umgestellt bringt auch nix

    MfG Maik


Anmelden zum Antworten