logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak wyczyścić bufor po odczycie danych przez ReadFile w WinAPI?

prokopcio 16 Mar 2007 18:32 1523 5
  • #1 3684919
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    Witam.
    Mam taki problem przy transmisji przez Com2 używam funkcji WinApi CreateFile, WriteFile, ReadFile z wykorzystanie bufaora danych - tablic znaków...

    i mam taki problem : jeśli wykryję, że w buforze są dane:

    IF stat.cbInQue > 0 THEN.....

    to odczytuję dane do bufora:

    ReadFile(.......,Buffer_I,...)

    i jest wszystko ok... ale do momentu otrzymania następnych danych o ilości znaków mniejszej niż poprzednio... wtedy po wykryciu "niepustego" bufora i jego odczycie dostaję dane także z poprzedniej transmisji nadpisane jedynie na początku dam przykład...

    pierwszym razem z urządzenia dostaję znaki "abcdefghijk" i po odczycie bufora do zmiennej string otrzymuję "abcdefghijk", jeśli następnym razem dostanę mniejszą porcję danych np "TEST" to po odczycie bufora otrzymuję: "TESTefghijk" .... proszę o pomoc jak rozwiązać ten problem...
  • #2 3684959
    Sam Sung
    Poziom 33  
    Posty: 2023
    Pomógł: 227
    Ocena: 602
    Funkcja ReadFile w jakiś sposób przekazuje ilość odczytanych bajtów (do sprawdzenia w dokumentacji). Należy brać pod uwagę tylko tą ilość danych...
  • #3 3685061
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    Tak wiem ale wygodniej by mi było wyczyścić bufor po odczycie i się niczym nie martwić tak jak przy pierwszym odczycie... ale nie wiem jak. po uruchomieniu programu jest pusty a później tylko się rozrastają dane w nim...
  • #4 3688059
    Konto nie istnieje
    Konto nie istnieje  
  • #5 3690714
    Akane
    Poziom 27  
    Posty: 638
    Pomógł: 144
    Ocena: 33
    Gdy odczytujesz string za pomocą ReadFile(handle, bufor, maximum-1, &odebrano, 0)
    to zbyteczne śmieci usuwasz tak: bufor[odebrano]=0.

    FlushFileBuffers wymusza zapisanie "zawartości pliku" z buforowanej pamięci do pliku. Buforowanie polega na tym, że zapis do pliku kopiuje dane do bufora systemowego gdzie dopiero po przekroczeniu kilku wielokrotności rozmiaru sektora te dane są zapisywane na dysku.
    Dla tego zapisując 1000 razy jeden bajt program działa nadal szybko, a wyłączając buforowanie potrwa to conajmniej kilka sekund.
  • #6 3690741
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    nie wystarcza... już sobie poradziłem jednak na podstawie odczytu tylko tylu bajtów, ile podaje parametr Stat.cbInQue. A problem polegał na tym, że początkowo bufor (Array of Char) nie jest pusty tylko wypełniony zerami a zero to koniec łańcucha więc jak otrzymałem powiedzmy łańcuch "Hello World" to odczytywany do zmiennej string był od początku do bajtu 0 (następnego po 'd') czyli prawidłowo natomiast jak otrzymałem następnie powiedzmy "test" to po odczycie do zmiennej string otrzymywałem wyszystko od początku do zera więc 'testo World' - nie darady też było odebrać bajtu 0 więc przemianowałem tablicę na Array of byte i okazało się, że cały czas jest ona pełna i trzeba odczytywać tylko ilość bajtów przekazaną przez Stat.cbInQue...
    może komuś się to info przyda...

    pozdrawiam.
REKLAMA