c - kan ikke korrekt læse datastreng ved hjælp af Windows Serial i windows.h

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en microcontroller tilsluttet min USB-port, som jeg læser ved hjælp af koden nedenfor
`


#include <windows.h>
#include <stdio.h>
#include <conio.h>

int main (void)
{

    int n = 25;
    char szBuff[25 + 1] = {0};

    HANDLE hSerial;
    DCB dcbSerialParams = {0};
    COMMTIMEOUTS timeouts={0};
    DWORD dwBytesRead =25;

    dcbSerialParams.DCBlength=sizeof(DCB);

    hSerial = CreateFile("COM4",
                     GENERIC\_READ | GENERIC\_WRITE,
                     0,
                     0,
                     OPEN\_EXISTING,
                     FILE\_ATTRIBUTE\_NORMAL,
                     0);


    if(hSerial==INVALID\_HANDLE\_VALUE)
    {
      if(GetLastError()==ERROR\_FILE\_NOT\_FOUND)
      {
        puts ("cannot open port!");
        return;
      }

      puts ("invalid handle value!");     
      return;                            
    }

    if (!GetCommState(hSerial, &dcbSerialParams)) 
    {
      puts ("error getting state");
      return;
    }

    dcbSerialParams.BaudRate=CBR\_57600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;

   if(!SetCommState(hSerial, &dcbSerialParams))
   {
      puts ("error setting port state");
      return;
   }

   timeouts.ReadIntervalTimeout = 30;
   timeouts.ReadTotalTimeoutMultiplier = 100;
   timeouts.ReadTotalTimeoutConstant = 100;

   if (!SetCommTimeouts(hSerial, &timeouts))
   {
      puts ("timeouts setting fail!");
   }

   while (1){      
   if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
      puts ("serial read error fail!");
      return;
   } 

   else
   {
      printf ("\%s
" , szBuff);
   }
   }


   getch();     
   return 0;

}
`


Jeg sender data med dette format: $ A.B.C $ efterfulgt af en ny linje. så er dens 7 (eller 8, inklusive newline) bytes ret? Jeg sætter det 3. argument for readfile til 20, større end 7 bytes, så jeg kan lykkes læse hele datastrengen. Men læsning savner nogle gange nogle få tegn. i stedet for at læse $ A.B.C $ jeg læser i en linje $ A.B.C og i linjen efter den $ (en skjult '\ n'). hvordan kan jeg løse dette?

Bedste reference


Dette er normalt. Når modtagebufferen indeholder mindst en byte, får du tilbage, hvad der er i bufferen. Det er normalt en brøkdel af det, du forventer, serielle porte er ret langsomme. Du skal fortsætte med at læse, indtil du får det fulde respons.

Andre referencer 1


Bare for at tilføje til svaret, skal du sørge for at bruge en eller anden type timeout, eller du vil blokere for at vente på et tegn, som måske aldrig kommer.


Måske kan en mulighed læses byte per byte, så vente den sidste '$' eller '\ n' for at vide, at du har modtaget den komplette streng og derefter behandler den.