OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2588|回复: 5

f1的gps模块中.的gps.c文件有两个问题不太懂

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2019-4-24
在线时间
17 小时
发表于 2020-3-10 10:16:37 | 显示全部楼层 |阅读模式
10金钱
示范程序中的gps.文件                temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx);//得到UTC时间,去掉ms,/表示求商
为什么除以NMEA_Pow(10,dx);这个就可以去掉ms呢?另外就是,整个函数中dx到底是多少?感觉dx有点悬乎?

下面附上程序:


//分析GPRMC信息
//gpsx:nmea信息结构体
//buf:接收到的GPS数据缓冲区首地址
void NMEA_GPRMC_Analysis(nmea_msg *gpsx,u8 *buf)
{                                                                                       
        //nmea_msg协议解析后数据存放结构体
                                                                                               
        u8 *p1,dx;                         
        u8 posx;     
        u32 temp;          
        float rs;  
        p1=(u8*)strstr((const char *)buf,"GPRMC");// 声明一个指向字符或字符串常量的指针(buf所指向的内容不可修改)
        //buf本来是u8,为什么这里要变成char呢

       
        //下面这段是重点要看的!!!
        posx=NMEA_Comma_Pos(p1,1);        //得到UTC时间
        //因为utc时间是第一个逗号之后的数据
        if(posx!=0XFF)//遇到'*'(结束符)或者非法字符,则不存在第cx个逗号
        {
                temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx);//得到UTC时间,去掉ms,/表示求商
       
                gpsx->utc.hour=temp/10000;//形参的结构体变量
                gpsx->utc.min=(temp/100)%100;
                gpsx->utc.sec=temp%100;                                
        }       

最佳答案

查看完整内容[请看2#楼]

gps数据UTC时间格式为 hhmmss.sss,按楼主给出的例程看,具体实现猜想是如此: 1、截取UTC时间字符串“hhmmss.sss” 2、将字符串转为数字,“hhmmss.sss”-> hhmmsssss , 使用函数为 NMEA_Str2num(p1+posx, &dx),其中dx估计为小数点位数变量, 即此函数也同时获得UTC时间数字含小数点的位数。 3、NMEA_Pow(10,dx) 此函数估计是跟据dx小数位数作幂次方,即求出 10 ^ dx。 4、而后 hhmmsssss / (10 ^ dx) 总的来说,编程作者 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
857
金钱
857
注册时间
2015-2-12
在线时间
353 小时
发表于 2020-3-10 10:16:38 | 显示全部楼层
gps数据UTC时间格式为 hhmmss.sss,按楼主给出的例程看,具体实现猜想是如此:
1、截取UTC时间字符串“hhmmss.sss”
2、将字符串转为数字,“hhmmss.sss”-> hhmmsssss , 使用函数为 NMEA_Str2num(p1+posx, &dx),其中dx估计为小数点位数变量, 即此函数也同时获得UTC时间数字含小数点的位数。
3、NMEA_Pow(10,dx) 此函数估计是跟据dx小数位数作幂次方,即求出 10 ^ dx。
4、而后 hhmmsssss / (10 ^ dx)
总的来说,编程作者是为了兼容上考虑,估计是认为GPS UTC时间格式小数点后几位数是不固定的,有可能不恒定为3位数小数。
因上两函数并没有具体给出,所以是猜测,仅供参考!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-11 00:47:17 | 显示全部楼层
这个,你给数据,然后就很好分析了,这就是解析字符串而已。还有,如果实在理解困难,可以直接用就是了,不需要研究怎么来的。
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
857
金钱
857
注册时间
2015-2-12
在线时间
353 小时
发表于 2020-3-11 08:53:14 | 显示全部楼层
因以下两函数实例没有给出,所以猜测如下:
1、NMEA_Str2num(p1+posx,&dx)   将获取UTC时间字符串 转为数字  "hhmmss.sss" -> hhmmsssss 并获取该UTC时间字符串的小数点后的位数 dx。
2、NMEA_Pow(10,dx)  根据得到的dx,将其视为幂数,计算出 10 ^ dx。
3、hhmmsssss / 1000 = hhmmss
4、程序编写者,估计是为了兼容上考虑,他可能认为 “hhmmss.sss??”小数位是不确定的。
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2020-3-11 09:12:39 | 显示全部楼层
  1. temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx);                 //得到UTC时间,去掉ms
复制代码


这句里面 NMEA_Str2num(p1+posx,&dx) 这前面先给 dx 赋值,赋值的含义为小数点的位数,NMEA_Pow(10,dx)这个就是 10 的 dx 次方。

如果这个数是 123.45678 ,则在前面得到 dx = 5,也就是小数点位数为5 ,但是解析出来的数字是不带小数点的 12345678 ,所以除以 10 的 5 次方,得到 123.45678 。
茵茵猪头
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2018-10-31
在线时间
34 小时
发表于 2020-3-11 10:36:42 | 显示全部楼层
我最近也在搞gps模块,原子哥的例程真的方便
int NMEA_Str2num(uint8_t *buf,uint8_t*dx) 这个函数就是字符串转数字的函数,dx是小数的个数,举个例子吧:
$GNRMC,100021.00,A,3959.99954,N,11600.16431,E,21.825,89.37,191038,,,A,V*0A
这里UTC时间是100021.00,调用这个函数返回值就是10002100,此时的dx就是2,temp = 10002100/10^2

还有我发现例程里有个地方不对:
在GSV的解析函数里     len=p1[7]-'0';                //得到BDGSV的条数
应该是len=p1[6]-'0';
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 08:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表