新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2015-1-23
- 在线时间
- 1 小时
|
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语言不熟,好好练习。
|