2010-11-15 4 views
1

J'essaie d'utiliser la fonction readfile pour lire le port série en C++. Je parviens à ouvrir et lire le port série en C++. le problème que je fais face maintenant est le décodage des données après que j'ai lu du port série. Les ci-dessous sont mes codes. Lorsque je cours mon code, ma boucle de décodage ne peut pas détecter ((* & szChar == '$')), et il quitte la boucle en raison d'une erreur d'impression. Mai je sais comment pourrais-je décoder les données gps que je lis de mon port série? grâceProblème de décodage du GPS série à l'aide de la fonction de lecture de fichier

char szChar[100]; 
int nRet; 
DWORD dwBytesRead = 10; 
char ReadBuffer[BUFFERSIZE] = {0}; 
nRet = ReadFile(hCom,&szChar,BUFFERSIZE-1,&dwBytesRead,NULL); 
if((*&szChar == '$')) 
{ 
    printf("%s\n", &szChar); 
} 
else 
{ 
    printf("error\n"); 
+0

Peut-être pourriez-vous commencer par éliminer certaines des données que vous recevez. Vous pourriez trouver (par exemple) que vous n'avez pas réglé le GPS en mode NMEA, donc ce que vous obtenez est différent. –

+0

J'ai obtenu le msg quelque chose comme ce $ GPGGA, 123519,4807,038, N, 01131,000, E, 1,08,0,9,545,4, M, 46,9, M ,, * 47 de la lecture du port série. mais le problème est que je pense que les données de & szChar sont toutes dans la chaîne plutôt que dans le tableau. Y at-il de toute façon je pourrais le décoder? merci – kevin

+0

Quelle est la valeur de szChar [0]? (Initialiser le tableau avant un appel à ReadFile(), puis imprimer szChar [0]) – Reno

Répondre

1

Je dois dire que je trouve votre code assez confus et déroutant. Juste par exemple, vous créez szChar comme un tableau de 100 char, et ReadBuffer comme un tableau de BUFFERSIZEchar s. Lorsque vous appelez ReadFile, cependant, vous passez l'adresse de base de szChar avec la taille donnée comme BUFFERSIZE. À moins que, par une certaine coïncidence, BUFFERSIZE arrive à égaler 100, cela ressemble beaucoup à un dépassement de tampon potentiel.

Ensuite, nous arrivons à *&szChar. Cela n'a pas vraiment de sens non plus. De l'apparence des choses, vous voulez probablement szChar[0] - mais même ce n'est pas vraiment une bonne idée, parce que vous pourriez ne pas recevoir les données en morceaux exactement de la taille d'une ligne. En tant que tel, vous voulez probablement parcourir les données pour trouver le '$'.

int Ret; 
DWORD BytesRead; 
char ReadBuffer[BUFFERSIZE] = {0}; 
Ret = ReadFile(hCom,ReadBuffer,sizeof(ReadBuffer)-1,&BytesRead,NULL); 

ReadBuffer[BytesRead] = '\0'; 

if (ReadBuffer[0] == '$') 
    printf(%s\n", ReadBuffer); 
else 
    printf("error\n"); 
+0

merci jerry pour votre aide .. je voudrais poser une question de ce qui précède ReadBuffer [0] == '$' est de lire la première lettre de la chaîne droite? Si tel est le cas, si je veux analyser la chaîne de données, puis-je mettre le ReadBuffer en tant que tableau? merci – kevin

+0

@kevin: oui - même si vous avez déjà défini ReadBuffer comme un tableau ... –

0

@Jerry: Merci .. donc je modifié mon code ci-dessous pour décoder mes données, il est bonne façon de mettre mon ReadBuffer dans un autre tableau pour vérifier?

char lastCommaPosition; 
char latitudeString[11]; 
char  stringRead[MAXSIZE]; 
char tempString[MAXSIZE]; 
char *pChar; 
char dummyChar; 
float  latitude; 
int   latDegrees; 
float  latMinutes; 
int  numLinesRead; 

int Ret,i,j,k; 
    if (ReadBuffer[0] == '$') 
{ 
    i = 0; 
    numLinesRead++; 
    stringRead[i] = ReadBuffer; 

} 
stringRead[i+1] = '\0'; 



j = 0; 
pChar = stringRead; 
while(*(pChar+j) != ',') 
{ 
     tempString[j] = *(pChar+j); 
     j++; 
} 
tempString[j] = '\0'; 


if(tempString[3] == 'G' && tempString[4] == 'G' && tempString[5] == 'A') 
{ 
    pChar = stringRead; 


     j = lastCommaPosition + 1; 
     k = 0; 
     while(*(pChar+j) != ',') 
     { 
     latitudeString[k] = *(pChar+j); 
     j++; 
     k++; 
     } 
     lastCommaPosition = j; 
     latitudeString[k] = '\0'; 

     sscanf(latitudeString, "%f", &latitude); 
     latDegrees = (int)(latitude/100); 
     latMinutes = (float)(latitude - latDegrees*100); 
     printf("\t%02d DEG\t%2.4f MIN", latDegrees, latMinutes); 
Questions connexes