string error

answerme's Avatar, Join Date: Dec 2007
Ambitious contributor
I am writing a program on serial port where iam sending a string
Code:
$GPGGA,123519,0.12343,N,0.19607,W,1,08,0.9,545.4,M,46.9,M,,*47"
On receive side I am getting the string on sResult properly (code below )but after the if condtion i.e.if((tmp[3]=='G')&&(tmp[4]=='G')&&(tmp[5]=='A')) value of gpsFrame is incorrect
Code:
void  *MTSerialRxThread()
{
	unsigned char *resp;
	char a='$';// For Comparsion of Last CHAR  GPS Data i.e.(New Line)
	unsigned char RMsg[74];  
	unsigned char tmp[6],val[1];
	int first =1;
	int rc = 0;
	int n=0;
	tmp[0]='$';
	
	readfd = open("/dev/ttyUSB0", O_RDONLY);
	
	if (readfd == -1)
	{
		perror("READ: open_port: Unable to open /dev/ttyUSB0- \n");
		return 1;
	}
	else
	{	printf("PORT OPENED\n");
		fcntl(readfd, F_SETFL, 0);
	}

	initport(readfd);
	cfsetispeed(&options, B9600); /// Set the baud rates
	
		while(a!=sResult)
		{
		if(read(readfd,sResult,1))
		{    
			val[0]=sResult[n];
			if(tmp[0]==val[0]) //For First Char $ ,if not $ read next char till its not equal to $ 
			{
				rc=1;
				RMsg[rc] = sResult[n];
			}
			else
			{
				RMsg[rc] = sResult[n];
				rc++;
			}
			tmp[3]=RMsg[3];
			tmp[4]=RMsg[4];
			tmp[5]=RMsg[5];
			printf("%s",sResult); //STRING IS CORRECT
		}	//printf("\nTMP VAR:%c %c %c\n ",tmp[3],tmp[4],tmp[5]);	
	if((tmp[3]=='G')&&(tmp[4]=='G')&&(tmp[5]=='A'))value is correct
	{
        memset(gpsFrame,0,74);
	memcpy(gpsFrame,sResult,flength);flength is 75
		printf("\n %s",gpsFrame);//STRING IS NOT CORRECT
		
	}
		
		
	}
}
Code:
OUTPUT OF gpsFRAME is  A,123519,0.12343,N,0.19607,W,1,08,0.9,545.4,M,46.9,M,,*4
NO idea why it coming like this Kindly give some solution

Last edited by answerme; 10Dec2010 at 16:37..
0
virxen's Avatar, Join Date: Nov 2009
Pro contributor
is this what you try to do in your code?

Code:
#include <stdio.h>
#include <string.h>

int main(){
    unsigned char gpsFrame[74]; 
    unsigned char sResult[]="$GPGGA,123519,0.12343,N,0.19607,W,1,08,0.9,545.4,M,46.9,M,,*47";
    memset(gpsFrame,0,74);
    printf("\n#%s#",gpsFrame);
    memcpy(gpsFrame,sResult,75);
    printf("\n #%s#",gpsFrame);
    getchar();
    return 0;
}
0
jimblumberg's Avatar
Ambitious contributor
Are gpsFrame,sResult,flength global variables?

If so how are gpsFrame and sResult defined? What is the array size?

What is the value fo flength inside your function?

Jim
0
answerme's Avatar, Join Date: Dec 2007
Ambitious contributor
Code:
Are gpsFrame,sResult,flength global variables?
Yes
Code:
If so how are gpsFrame and sResult defined? What is the array size?
unsigned char gpsFrame[74]
unsigned char sResult[flength]//flength (macro)value 75
I checked further when Iam printing sResult value inside if condition it is coming same as gpsFrame i.e
Code:
if((tmp[3]=='G')&&(tmp[4]=='G')&&(tmp[5]=='A'))value is correct
	{
        memset(gpsFrame,0,74);
	memcpy(gpsFrame,sResult,flength);flength is 75
	printf("\n %s",gpsFrame);//STRING IS NOT CORRECT
	printf("\n %s",sResult);//STRING IS NOT CORRECT
	}
OUTPUT OF gpsFRAME is  A,123519,0.12343,N,0.19607,W,1,08,0.9,545.4,M,46.9,M,,*4
OUTPUT OF sResult is  A,123519,0.12343,N,0.19607,W,1,08,0.9,545.4,M,46.9,M,,*4
Than means there is the problem inside if condtion but iam not able to get it
0
virxen's Avatar, Join Date: Nov 2009
Pro contributor
the error is outside the if clause and more specific in the creation of sResult

try this to realiaze it

Code:
............
printf("\n before=%s",sResult);//is it correct?
if((tmp[3]=='G')&&(tmp[4]=='G')&&(tmp[5]=='A'))
      {
       printf("\n after=%s",sResult);//is it correct?

............

and try this also.You will see that memset,memcopy works
Code:
#include <stdio.h>
#include <string.h>

int main(){
    unsigned char gpsFrame[74];
    unsigned char sResult[75];
    memcpy(sResult,"$GPGGA,123519,0.12343,N,0.19607,W,1,08,0.9,545.4,M,46.9,M,,*47",75);
    printf("\n before=#%s#",sResult);//correct
	memset(gpsFrame,0,74);
	memcpy(gpsFrame,sResult,75);
	printf("\n #%s#",gpsFrame);//correct
	printf("\n after=#%s#",sResult);//correct
	getchar();
	return 0;
}


p.s. what's your compiler?

Last edited by virxen; 11Dec2010 at 16:11..
0
answerme's Avatar, Join Date: Dec 2007
Ambitious contributor
Code:
............
printf("\n before=%s",sResult);//is it correct? //HERE PERFECTLY OK
if((tmp[3]=='G')&&(tmp[4]=='G')&&(tmp[5]=='A'))
      {
       printf("\n after=%s",sResult);//is it correct? //ERROR IS HERE

............
#include <stdio.h>
#include <string.h>

Code:
int main(){
    unsigned char gpsFrame[74];
    unsigned char sResult[75];
    memcpy(sResult,"$GPGGA,123519,0.12343,N,0.19607,W,1,08,0.9,545.4,M,46.9,M,,*47",75);
    printf("\n before=#%s#",sResult);//correct
	memset(gpsFrame,0,74);
	memcpy(gpsFrame,sResult,75);
	printf("\n #%s#",gpsFrame);//correct
	printf("\n after=#%s#",sResult);//correct
	getchar();
	return 0;
}
YES ABOVE THIS WORKS

I got the problem now problem is here
Code:
if(tmp[0]==val[0]) //For First Char $ ,if not $ read next char till its not equal to $ 
			{
				rc=1;
				RMsg[rc] = sResult[n];
			}
			else
			{
				RMsg[rc] = sResult; //PROBLEM IS HERE
				rc++;
			}
where sResult is unsigned char sResult[74]
sResult is string and RMsg is unsigned char Rmesg[74].I believe this is a wrong way
0
virxen's Avatar, Join Date: Nov 2009
Pro contributor
if i have got it right you want to do something like this?

Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(){
    int i;
    unsigned char gpsFrame[74];
    unsigned char sResult[75];
    unsigned char RMsg[74];  
    int n=0;
    memcpy(sResult,"123$GPGGA,123519,0.12343,N,0.19607,W,1,08,0.9,545.4,M,46.9,M,,*47",75);
    printf("\nbefore--->#%s#",sResult);
    while(sResult[n]!='$'){
        n++;
    }
    int len=sizeof(sResult)/sizeof(unsigned char);
    for (i=0;i<len-n;i++){
        RMsg[i]=sResult[n+i];
    }
    RMsg[i]='\0';
    printf("\n\n  RMsg--->#%s#",RMsg);
    memset(sResult,0,75);
    memcpy(sResult,RMsg,75);
    printf("\n#%s#",sResult); //STRING IS CORRECT
   if((RMsg[3]=='G')&&(RMsg[4]=='G')&&(RMsg[5]=='A')){
       memset(gpsFrame,0,74);
       memcpy(gpsFrame,sResult,75);
       printf("\n #%s#",gpsFrame);
       printf("\n after=#%s#",sResult);
    }
    getchar();
    return 0;
}
0
answerme's Avatar, Join Date: Dec 2007
Ambitious contributor
Ya u are correct this is what i want to do but
1.data is coming from serial port which is unsigned char sResult[75]
2.When Iam printing RMsg value .I am getting String always on 0th index .i.e on 0th value i get G then remain 74index it is all zero's ,then once again for loop starts I get next char P then 74 value zero's & so on
I checked the sResult output also its taking value in sResult[0] index only.
Code:
int len=sizeof(sResult)/sizeof(unsigned char);
    for (i=0;i<len-n;i++){
        RMsg[i]=sResult[n+i];
        printf("%c",RMsg[i]);
    }

Last edited by answerme; 14Dec2010 at 12:31..