打印

以前项目写的一个取GPS经纬度数据的代码

[复制链接]
3532|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zheng522|  楼主 | 2011-12-13 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用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 ;
      }
    }
  }
}

相关帖子

沙发
tianm| | 2011-12-14 08:53 | 只看该作者
NMEA-0183协议是GPS接收机应当遵守的标准协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。

使用特权

评论回复
板凳
yoyowodeai| | 2011-12-14 10:58 | 只看该作者
楼主牛人啊

使用特权

评论回复
地板
TA| | 2011-12-14 13:34 | 只看该作者
好东西 下下来好好研究一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

821

帖子

3

粉丝