用430单片机写的程序,用的是北京合众思壮的GPS15L,将数据存在全局变量的数组中,可以参考下。
void GPSInterrupt()
{
static uchar GPS_index=0; //index表示GPS所有数据的指针
static uchar GPSmessage[50]={0};//存放接收过来的GPS的所有信息
if((P3OUT&0x07)==6) //判断是否是GPS数据
{
//判断当前字符是否是新的一帧数据的开始('$')
if(U0RXBUF=='$')
{
//若收到了'$',表示新的一帧数据开始,此时清空GPS缓冲区
memset(GPSmessage,0,sizeof(GPSmessage)) ;
//存储'$'
GPSmessage[0]=U0RXBUF;
//计数器置1
GPS_index = 1 ;
}
else //除了'$'外的其它字符
{
//判断缓冲区中是否还有空间
if(GPS_index < sizeof(GPSmessage))
{
if(GPSmessage[0]=='$')//若缓冲区中有空间且已经收到了帧数据开始('$')
{
GPSmessage[GPS_index]=U0RXBUF;
if(GPSmessage[GPS_index]==0x0a)//收到了一帧数据的结束
{
++GPS_index ;
int iPos = 0 ;
//用来保存GPS帧的数据头
BUF_10 head;
memset(head,0,sizeof(head)) ;
//循环取出GPS帧中用逗号分隔的各个部分
for(uchar k = 0 ; k < 7 ; ++k)
{
/*
strpbrk-函数功能
原型:extern char *strpbrk(char *s1, char *s2);
用法:#include <string.h>
功能:在字符串s1中寻找字符串s2中任何一个字符相匹配的第一个字符的位置,空字符NULL不包括在内。
说明:返回指向s1中第一个相匹配的字符的指针,如果没有匹配字符则返回空指针NULL。
*/
//(char*)GPSmessage+iPos从之后找字符串中是否包含逗号或回车
char* ptr = strpbrk((char*)GPSmessage+iPos,",\n");
if(ptr != NULL)//还有逗号、或回车
{
//求出(char*)GPSmessage+iPos之后剩余字符的个数
unsigned short len = ptr-(char*)GPSmessage-iPos;
//保证从GPSmessage数组中取数据是不会越界
if(len+iPos < GPS_index && GPS_index > 2 && len < sizeof(GPSmessage))
{
if(k == 0)//第0个肯定是帧头
{
if(len < sizeof(head))
{
memcpy(head,GPSmessage+iPos,len) ;
}
else
{
goto clear;
}
}
else if(k == 1)//第1个肯定是纬度的数字部分
{
if(len <= sizeof(WEIDU)-1)
{
memcpy(WEIDU+1,GPSmessage+iPos,len) ;
}
else
{
goto clear;
}
}
else if(k == 2)//第2个肯定是纬度的南北标志部分
{
if(len <= sizeof(WEIDU))
{
memcpy(WEIDU,GPSmessage+iPos,len) ;
}
else
{
goto clear;
}
}
else if(k == 3)//第3个肯定是经度的数字部分
{
if(len <= sizeof(JINGDU)-1)
{
memcpy(JINGDU+1,GPSmessage+iPos,len) ;
}
else
{
goto clear;
}
}
else if(k == 4)//第4个肯定是纬度的东西标志部分
{
if(len <= sizeof(JINGDU))
{
memcpy(JINGDU,GPSmessage+iPos,len) ;
}
else
{
goto clear;
}
}
else if(k == 6)//第6个肯定是GPS锁定标志
{
GPS_flag = GPSmessage[iPos] ;
}
iPos += len + 1 ;//+1是因为越过分隔符",>"
}
else
{
//数组越界的情况
goto clear ;
}
}
else
{
//没有逗号,也没有找到'\n'
goto clear;
}
}
if(0==strcmp(head,"$GPGLL"))
{
P3DIR|=BIT0+BIT1+BIT2;
P3OUT|=BIT0+BIT2+BIT1;
return ;
}
else
{
goto clear;
}
}
else
{
++GPS_index ; //继续收集字符
}
}
else
{
//缓冲区有空间,但并未收到'$',则清空锁定标志,计数器和缓冲区
GPS_flag=0;
GPS_index = 0;
memset(GPSmessage,0,sizeof(GPSmessage)) ;
}
}
else
{
clear:
//缓冲区没有空间,则清空锁定标志,计数器和缓冲区,和经纬度缓冲区
GPS_flag=0;
GPS_index = 0;
memset(WEIDU,0,sizeof(WEIDU)) ;
memset(JINGDU,0,sizeof(JINGDU)) ;
memset(GPSmessage,0,sizeof(GPSmessage)) ;
return ;
}
}
}
} |