OpenEdv-开源电子网

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

正点原子GPS程序。有人能给解释一样么,没有看懂,谢谢

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-1-23
在线时间
1 小时
发表于 2015-2-7 17:17:41 | 显示全部楼层 |阅读模式
5金钱
由于本人对结构体不太了解,正在看这方面知识,有几个地方没有看懂,希望有人能给讲一讲,谢谢!!!
1、__packed typedef struct  
{    
  u8 num; //卫星编号
u8 eledeg; //卫星仰角
u16 azideg; //卫星方位角
u8 sn; //信噪比   
}nmea_slmsg;  

这样定义了结构体,放在GPS.H里,如果别的.C文件#include "gps.h" ,这样的话结构体的变量算是全局变量吗?
2、nmea_msg  gpsx; //GPS信息
在mian.c的开头有上面这句话,这句话的作用是什么?
3、//分析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信息
}   
}

为什么要这样写函数,u8 *buf  是指向收到数据的首地址,nmea_msg *gpsx  是什么作用,怎么通过它就指向了nmea_msg中的的结构体变量,
4、void GPS_Analysis(nmea_msg *gpsx,u8 *buf)
{
NMEA_GPGSV_Analysis(gpsx,buf); //GPGSV解析
NMEA_GPGGA_Analysis(gpsx,buf); //GPGGA解析
NMEA_GPGSA_Analysis(gpsx,buf); //GPGSA解析
NMEA_GPRMC_Analysis(gpsx,buf); //GPRMC解析
NMEA_GPVTG_Analysis(gpsx,buf); //GPVTG解析
}
如何调用这个函数,没有看懂主函数中调用的方法GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串

总结:也许叙述的有点混乱,我的总体问题就是,如何实现调用GPS.c中的函数,分析出GPS的参数。
可能问的问题比较弱智,但是我真的没有看明白,谢谢大神解答!!!

最佳答案

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

1,这是个结构体类型定义,不是结构体。 2,定义结构体变量:gpsx 3,这是两个参数。 4,给合法参数,就可以调用该函数。 总结:你C语言不熟,好好练习。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-7 17:17:42 | 显示全部楼层
1,这是个结构体类型定义,不是结构体。
2,定义结构体变量:gpsx
3,这是两个参数。
4,给合法参数,就可以调用该函数。

总结:你C语言不熟,好好练习。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2015-2-7 17:46:07 | 显示全部楼层
前面3个都是c语言问题,结构体类型定义,结构体变量定义,结构体传参

最后一个是在main里循环调用,功能就是从一串串口数据里取出有用数据,可以不去关心具体做了什么,直接用
博观而约取,厚积而薄发。
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-1-23
在线时间
1 小时
 楼主| 发表于 2015-2-9 12:16:08 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------谢谢
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-1-23
在线时间
1 小时
 楼主| 发表于 2015-2-9 12:16:19 | 显示全部楼层
回复【2楼】745021926:
---------------------------------
谢谢
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-1-23
在线时间
1 小时
 楼主| 发表于 2015-2-9 16:46:13 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
1、为什么pps引脚有时候不能正常输出方波
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-9 22:27:30 | 显示全部楼层
回复【6楼】易州许:
---------------------------------
没定位就不能输出
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-1-23
在线时间
1 小时
 楼主| 发表于 2015-2-10 12:47:18 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
但是日期等其他信息都正常输出
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-10 23:12:43 | 显示全部楼层
回复【8楼】易州许:
---------------------------------
日期输出,不一定定位了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-3-20
在线时间
2 小时
发表于 2015-8-14 08:38:13 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥,你好。我引用你的程序做实验。怎么gpsx->svnum一直是12,gpsx->slmsg里面的卫星编号好多重复的,只有4 5个编号不一样。而gpsx.posslnum有9个以上。这是为什么?
一分耕耘一分收获
回复

使用道具 举报

5

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-3-20
在线时间
2 小时
发表于 2015-8-14 08:50:47 | 显示全部楼层
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信息
}   
}
这个GPGSV是3条,但svnum不是12  或者是10的话。按这程序来读,那也会照样读到12组slmsg数据,是不?
一分耕耘一分收获
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 02:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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