bit gps_ok; //如果gps_ok=1,表示接收成功、数据有效。
const char gga[]="$gpgga,";
struct gps //存储gps接收并提取出来的有用数据
{
unsigned char m_latitude[11]; //纬度
unsigned char m_longitude[12]; //经度
unsigned char m_altitude[10]; //海拔
}gps;
unsigned char sbuf;
bit flag; //用于表征该字节数据接收有效与否:其值为1 时,此次字节接收正确有效;否则,为无效接收
void getch(void)
{ unsigned char i=0;
while(!ri)
{if(i++>100) //用于防止接收数据过程中可能出现的等
{ //待死锁
flag=0;
return;}
}
ri = 0;
flag=1;
sbuf=sbuf;
}
/**串行口通讯***/
void serial_int(void) interrupt 4
{
unsigned char ii=0;
ea=0;
es=0;
gps_ok=0; //关串行中断
for(ii=0;ii<7;ii++) //接收并识别gga 数据帧的帧头
{
getch();
if(sbuf!=gga[ii] || flag==0) //若不是gga 数据帧的帧头,则开中断退出中断服务程序
{es=1;ea=1;return;}
};
do { //接收时钟“ hhmmss.dd,”字段
getch();
if(flag==0){es=1;ea=1;return;} //接收无效,退出中断服务程序
}while(sbuf!=',');
ii=0;
do { //接收纬度“ xxmm.dddd,”字段
getch();
if(flag==0){es=1;ea=1;return;} //接收无效,退出中断服务程序
gps.m_latitude[ii++]=sbuf;
}while(sbuf!=',');
do { //接收北半球或南半球“ <n|s>, ”字段
getch();
if(flag==0){es=1;ea=1;return;} //接收无效,退出中断服务程序
gps.m_latitude[ii++]=sbuf;
}while(sbuf!=',');
gps.m_latitude[ii-1]='\0' //转换成以‘\0’结尾的字符串
ii=0;
do { //接收经度“yyymm.dddd,”字段
getch();
if(flag==0){es=1;ea=1;return;} //接收无效,退出中断服务程序
gps.m_longitude[ii++]=sbuf;
}while(sbuf!=',');
do { //接收东半球或西半球“ <e|w>,”字段
getch();
if(flag==0){es=1;ea=1;return;} //接收无效,退出中断服务程序
gps.m_longitude[ii++]=sbuf;
}while(sbuf!=',');
gps.m_longitude[ii-1]='\0' //转换成以‘\0’结尾的字符串
for(ii=0;ii<3;ii++)
do { //接收“ v,ss,d.d,”字段,但不保留存储
getch();
if(flag==0){es=1;ea=1;return;} //接收无效,退出中断服务程序
}while(sbuf!=',');
ii=0;
do { // 接收海拔高度“ h.h,”字段
getch();
if(flag==0){es=1;ea=1;return;} //接收无效,退出中断服务程序
gps.m_altitude[ii++]=sbuf;
}while(sbuf!=',');
gps.m_altitude[ii-1]='\0' //转换成以‘\0’结尾的字符串
do { //接收所有剩下的字段直至数据帧的结尾标志换行号‘\n’
getch();
if(flag==0){es=1;ea=1;return;} //接收无效,退出中断服务程序
}while(sbuf!='\n');
gps_ok=1;ti=0;es=1;ea=1; //置此次数据接收有效,重开串行中断等待接收
}