Avatar billede sbruun Nybegynder
15. august 2007 - 14:23 Der er 4 kommentarer og
1 løsning

ReadFile - bytesread ikke samme som længde??

Efter en del fejlsøgning er har jeg fundet frem til at der opstår en fejl når jeg læser fra comporten, nærmere bestemt ReadFile funktionen. Programmet er i korte træk som følger:
En grafisk applikation skal hente data fra noget eksternt hardware gennem en comport. Dette går godt ca. hver anden gang. Men nogen gange opstår følgende problem:

bytes_read er ikke samme størrelse som Len (ca. 7-10 mindre).
I næste læsning er bytes_read helt håbløs, dvs. 0, og det der står i bufferen er garbage.

Således ser kodestumpen ud jeg læser med:

ret_val = ReadFile( m_porthandle, buf, *Len + 3, &bytes_read, 0 );

Ved at sniffe på comporten kan jeg se at det der bliver sendt fra det eksterne hardware er helt korrekt. Men at der ikke bliver sendt noget ack tilbage, hvilket jo er helt rigtig, da det kode der er modtaget i bufferen ikke er acceptabelt.

Jeg vil helst undgå at skulle til at sende det samme kode igen fra det eksterne hardware, da dette knapt nok er muligt at ændre i, som det er nu.

Er der nogen der har erfaringer med ReadFile, og hvad der evt. kan gå galt for mit software?

På forhånd tak!
Avatar billede arne_v Ekspert
15. august 2007 - 20:41 #1
Hvilken data type er Len ?
Avatar billede sbruun Nybegynder
16. august 2007 - 08:16 #2
Her er datatyperne:

HANDLE m_porthandle;
unsigned char * buf
unsigned int* Len
unsigned long bytes_read

/Simon
Avatar billede arne_v Ekspert
16. august 2007 - 22:40 #3
Jeg er lidt skeptisk overfor *Len + 3. Er buf stoerre end Len ?

Der er ioevrigt ikke noget galt ved at du laeser faerre bytes end du har bedt om.

Hvis du venter lidt og laeser igen - er der saa noget at laese ?
Avatar billede sbruun Nybegynder
17. august 2007 - 14:15 #4
buf og Len er naturligvis tilpasset hianden. Hvis jeg læser igen, er der ikke noget i bufferen, men det er ligesom der bare er gået noget data tabt i overførslen. Muligvis er bufferen til comporten ikke hurtig nok? Men får på intet tidspunkt nogen fejlmeddelse fra DWORD GetLastError(VOID) , hvilket jeg ikke helt forstår. Jeg prøver mig nu med en ny udgave hvor jeg kun læser 1 byte af gangen, for at se om det ændrer noget - andet end hastigheden:(
Avatar billede sbruun Nybegynder
21. august 2007 - 07:04 #5
Det viste sig at være buffer overrun. Ellers tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester