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..
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;
}
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
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
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..
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
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;
}
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..