![](https://csdnimg.cn/release/download_crawler_static/86299696/bg5.jpg)
if(flen>5)flen=5; //最多取 5 位小数
*dx=flen; //小数点位数
for(i=0;i<flen;i++) fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');//得到小数部分
res=ires*NMEA_Pow(10,flen)+fres;
if(mask&0X02)res=-res;
return res;
}
//分析 GPGSV 信息
//gpsx:nmea 信息结构体
//buf:接收到的 GPS 数据缓冲区首地址
void NMEA_GPGSV_Analysis(nmea_msg *gpsx,u8 *buf)
{
u8 *p,*p1,dx;
u8 len,i,j,slx=0;
u8 posx;
p=buf;
p1=(u8*)strstr((const char *)p,"$GPGSV");
len=p1[7]-'0'; //得到 GPGSV 的条数
posx=NMEA_Comma_Pos(p1,3); //得到可见卫星总数
if(posx!=0XFF)gpsx->svnum=NMEA_Str2num(p1+posx,&dx);
for(i=0;i<len;i++)
{
p1=(u8*)strstr((const char *)p,"$GPGSV");
for(j=0;j<4;j++)
{
posx=NMEA_Comma_Pos(p1,4+j*4);
//得到卫星编号
if(posx!=0XFF)gpsx->slmsg[slx].num=NMEA_Str2num(p1+posx,&dx);
else break;
posx=NMEA_Comma_Pos(p1,5+j*4);
//得到卫星仰角
if(posx!=0XFF)gpsx->slmsg[slx].eledeg=NMEA_Str2num(p1+posx,&dx);
else break;
posx=NMEA_Comma_Pos(p1,6+j*4);
//得到卫星方位角
if(posx!=0XFF)gpsx->slmsg[slx].azideg=NMEA_Str2num(p1+posx,&dx);
else break;
posx=NMEA_Comma_Pos(p1,7+j*4);
//得到卫星信噪比
if(posx!=0XFF)gpsx->slmsg[slx].sn=NMEA_Str2num(p1+posx,&dx);
else break;
slx++;
}
p=p1+1;//切换到下一个 GPGSV 信息