📄 nmeastring.cpp
字号:
char tmp[20];
while(str[i]!='.' && str[i]) i++;
if(!str[i])
{
intr=atoi(str);
deci=0;
}
else
{
memcpy(tmp,str,i);
tmp[i]=0;
intr=atoi(tmp);
len=strlen(str)-i-1;
if(len>0)
memcpy(tmp,str+i+1,len);
tmp[len]=0;
deci=atoi(tmp);
}
result=(intr*10000.0+deci)/10000;
return result;
#else
if(str && str[0]!='\0')
{
return atof(str);
}
return 0;
#endif
}
double NmeaString::GetDecimalDegrees(double dCoordinate)
{
double return_value = 0.0;
int degrees = (int) ::floor(dCoordinate);//整数部分
int minutes = degrees % 100; //获得分的整数部分
double fractional_minutes = 0.0;
double throw_away = 0.0;
fractional_minutes = ::modf(dCoordinate,&throw_away);//获得分的小数部分
degrees -= minutes;
degrees /= 100;//获得度
return_value = degrees*3600.0;
return_value += (double)((double)minutes*(double)60.0);
return_value += (double)((double)fractional_minutes*(double)60.0);
return (return_value);
}
BOOL NmeaString::Checksum(int istart,int len)
{
int i=0;
unsigned char chksum=0,total;
char str[5];
i=istart+2;
chksum=m_pBuffer[istart+1];
while(m_pBuffer[i]!='*' && i<(len+istart))
{
chksum^=m_pBuffer[i];
i++;
}
if(m_pBuffer[i]!='*') return FALSE;
memcpy(str,m_pBuffer+i+1,2);
str[3]=0;
total=(unsigned char)strtoul(str,NULL,16);
if(total!=chksum)
return FALSE;
return TRUE;
}
int NmeaString::ParserGGA(int istart)
{
int i,res,tmp;
char *p,*token ;
double dHigh=0;
char str[10];
i=istart+1;
while(m_pBuffer[i]!='\r' && m_pBuffer[i+1]!='\n' && m_pBuffer[i]!='$' && i<m_lengh) i++;
if(i>=m_lengh) return -1;
res=i-istart+2;
m_pBuffer[res-1+istart]=0;
if(m_pBuffer[i]=='$') return res;
//验证数据有效性
tmp=0;
i=istart;
while(m_pBuffer[i])
{
if(m_pBuffer[i]==',') tmp++;
i++;
}
if(tmp!=14) return res;
//解析卫星数据
i=0;
p=m_pBuffer+istart;
token=StringTok(p,',');
while(token && i<NMEA_GPGGA_SEG_NUM)
{
switch(i)
{
case NMEA_GPGGA_TIME:
{
if(strlen(token)>=6)
{
memset(str,0,5);
memcpy(str,token,2);
m_gTime.wHour=atoi(str)+8;
memcpy(str,token+2,2);
m_gTime.wMinute=atoi(str);
memcpy(str,token+4,2);
m_gTime.wSecond=atoi(str);
}
}
break;
case NMEA_GPGGA_GPS_STATUS:
break;
case NMEA_GPGGA_LAT:
//dLat=GetDecimalDegrees(Str2Double(token));
break;
case NMEA_GPGGA_LONG:
//dLong=GetDecimalDegrees(Str2Double(token));
break;
case NMEA_GPGGA_STAR_NUM:
m_iStarNum=atoi(token);
break;
case NMEA_GPGGA_HIGH:
m_dHigh=Str2Double(token);
break;
}
token=StringTok(NULL,',');
i++;
}
return res;
}
int NmeaString::ParserGSA(int istart)
{
int i,res,tmp;
char *p,*token ;
double dHigh=0;
char str[10] = {0};
i=istart+1;
while(m_pBuffer[i]!='\r' && m_pBuffer[i+1]!='\n' && m_pBuffer[i]!='$' && i<m_lengh) i++;
if(i>=m_lengh) return -1;
res=i-istart+2;
m_pBuffer[res-1+istart]=0;
if(m_pBuffer[i]=='$') return res;
//验证数据有效性
tmp=0;
i=istart;
while(m_pBuffer[i])
{
if(m_pBuffer[i]==',') tmp++;
i++;
}
if(tmp != NMEA_GPGSA_SEG_NUM) return res;
//解析卫星数据
i=0;
p=m_pBuffer+istart;
token=StringTok(p,',');
while(token && i < NMEA_GPGSA_SEG_NUM + 1)
{
switch(i)
{
case NMEA_GPGSA_MODE:
{
//m_sGSAData.iMode = atoi(token);
if(!memcmp(token,"A",1))
m_sGSAData.iMode = 1;
else if(!memcmp(token,"M",1))
m_sGSAData.iMode = 2;
else
m_sGSAData.iMode = 0;
}
break;
case NMEA_GPGSA_TYPE:
m_sGSAData.iType = atoi(token);
break;
case NMEA_GPGSA_PDOP:
m_sGSAData.dPdop=atof(token);
break;
case NMEA_GPGSA_HDOP:
m_sGSAData.dHdop=atof(token);
break;
case NMEA_GPGSA_VDOP:
m_sGSAData.dVdop=atof(token);
break;
default:
break;
}
token=StringTok(NULL,',');
i++;
}
return res;
}
int NmeaString::StringFind(char* str,char chr)
{
int i=0;
while(str[i] && str[i]!=chr) i++;
if(str[i]==chr) return i;
return -1;
}
int NmeaString::ParserGSV(int istart)
{
int i,res,tmp;
char *p,*token ;
int iSentenceNum=0;
int iSentenceNo=0;
double dHigh=0; // 高程 米
i=istart+1;
while(m_pBuffer[i]!='\r' && m_pBuffer[i+1]!='\n' && m_pBuffer[i]!='$' && i<m_lengh) i++;
if(i>=m_lengh) return -1;
res=i-istart+2;
m_pBuffer[res-1+istart]=0;
if(m_pBuffer[i]=='$') return res;
//验证数据有效性
tmp=0;
i=istart;
while(m_pBuffer[i])
{
if(m_pBuffer[i]==',') tmp++;
i++;
}
if((tmp-3)%4) return res;
//return res;
//解析卫星数据
i=0;
p=m_pBuffer+istart;
token=StringTok(p,',');
while(token && i<(res+istart))
{
switch(i)
{
case NMEA_GPGSV_SENTENCE_NUM:
iSentenceNum=atoi(token);
break;
case NMEA_GPGSV_SENTENCE_NO:
iSentenceNo=atoi(token);
if(iSentenceNo==1 || iSentenceNo>iSentenceNum)
m_iStarDataLen=0;
break;
case NMEA_GPGSV_STAR_NUM:
m_iStarNumCon=atoi(token);
break;
case 0:
break;
default:
{
if((tmp=StringFind(token,'*'))>=0)
{
token[tmp]=0;
m_sStarData[m_iStarDataLen].sar=atoi(token);
m_iStarDataLen++;
m_iStarDataLen%=MAX_STAR_NUM;
break;
}
switch((i-3)%4)
{
case NMEA_GPGSV_STAR_NO:
m_sStarData[m_iStarDataLen].id=atoi(token);
break;
case NMEA_GPGSV_STAR_ANGLE:
m_sStarData[m_iStarDataLen].angleV=atoi(token);
break;
case NMEA_GPGSV_STAR_ANGLE2:
m_sStarData[m_iStarDataLen].angleH=atoi(token);
break;
case NMEA_GPGSV_STAR_SAR:
m_sStarData[m_iStarDataLen].sar=atoi(token);
m_iStarDataLen++;
m_iStarDataLen%=MAX_STAR_NUM;
break;
}
}
break;
}
token=StringTok(NULL,',');
i++;
}
return res;
}
BOOL NmeaString::AppendBuffer(char* str, int len)
{
int i;
int tmp;
char* p;
if(!str || len<=0) return FALSE;
//Checksum()
if((int)strlen(str)>len) str[len]=0;
//#ifdef WRITE_GPS_DATA_TO_FILE
if (m_bLogGpsData)
{
int fsize;
FILE* file;
file=fopen(WRITE_FILE_PATH,"a+b");
if(file)
{
fseek(file, 0, SEEK_END);
fsize = ftell(file)/1000;
fsize = fsize/1000;
if(fsize<20)
{
fwrite(str,1,len,file);
}
fclose(file);
}
}
//#endif
//clear the buffer
if(m_pos>0 && m_pos<m_lengh)
{
memcpy(m_pBuffer,m_pBuffer+m_pos,(m_lengh-m_pos)*sizeof(char));
m_lengh-=m_pos;
m_pBuffer[m_lengh]=0;
m_pos=-1;
}
else if(m_pos!=0)
{
m_lengh=0;
if(m_pBuffer)
m_pBuffer[0]=0;
}
//pack the buffer
if(m_lengh!=0 && m_size>(3*DEFAULT_NEMASTRING_LEN) && (m_size*1.0/m_lengh)>2)
{
p=(char*)malloc(DEFAULT_NEMASTRING_LEN*2);
if(p)
{
m_size=2*DEFAULT_NEMASTRING_LEN;
memset(p,0,m_size);
memcpy(p,m_pBuffer,m_lengh);
free(m_pBuffer);
m_pBuffer=p;
}
}
//store the old length
tmp=m_lengh;
//realloc the buffer
if((len+m_lengh)>m_size)
{
p=(char*)realloc(m_pBuffer,sizeof(char)*(len+m_lengh+1));
if(!p) return FALSE;
m_size=len+m_lengh+1;
m_pBuffer=p;
}
//append the buffer
memcpy(m_pBuffer+tmp,str,len);
m_lengh+=len;
m_pBuffer[m_lengh]=0;
//parser the buffer
i=0;
while(i<m_lengh)
{
if(m_pBuffer[i]=='$')
{
if(!memcmp(m_pBuffer+i,NMEA_GPRMC,NMEA_FRAME_FLAGS_LEN))
{
if((tmp=ParserRMC(i))<0)
{
m_pos=i;
break;
}
else
{
i+=tmp;
}
}
else if(!memcmp(m_pBuffer+i,NMEA_GPGGA,NMEA_FRAME_FLAGS_LEN))
{
if((tmp=ParserGGA(i))<0)
{
m_pos=i;
break;
}
else
{
i+=tmp;
}
}
else if(!memcmp(m_pBuffer+i,NMEA_GPGSV,NMEA_FRAME_FLAGS_LEN))
{
if((tmp=ParserGSV(i))<0)
{
m_pos=i;
break;
}
else
{
i+=tmp;
}
}
else if(!memcmp(m_pBuffer+i,NMEA_GPGSA,NMEA_FRAME_FLAGS_LEN))
{
if((tmp=ParserGSA(i))<0)
{
m_pos=i;
break;
}
else
{
i+=tmp;
}
}
else
i++;
}
else
i++;
}
return TRUE;
}
double NmeaString::Distance(double nX1, double nY1, double nX2, double nY2)
{
// 两点之间的距离
double nReturn = 0;
double ndX = nX1 - nX2;
double ndY = nY1 - nY2;
nReturn = sqrt(ndX * ndX + ndY * ndY);
return nReturn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -