Gavin_GC 发表于 2011-12-2 14:59:16

基于stm32的GPS解析

串口中断接收数据,当接收完6条信息后发送标志位,后台进行解析,先找到对应信息的位置(如$GPRMC);然后采用状态机读取经纬度等信息,
点击此处下载 ourdev_700873ZM72A5.rar(文件大小:2K) (原文件名:gps.rar)

337zhang 发表于 2012-3-5 21:56:00

看一下,谢谢分享

quillan 发表于 2012-4-5 22:45:55

楼主能发整个工程文件吗?

knliao 发表于 2012-4-6 09:35:11

可以用strstr()和atof和atoi等库函数来写,优化一下结构
另外,接收缓冲区用循环队列来做更好

Gavin_GC 发表于 2012-4-16 19:23:35

knliao 发表于 2012-4-6 09:35 static/image/common/back.gif
可以用strstr()和atof和atoi等库函数来写,优化一下结构
另外,接收缓冲区用循环队列来做更好 ...

恩,开始没有想到循环队列,现在做通信一般选择循环队列,然后查找帧头和帧尾(状态机)解析

EleHero2012 发表于 2012-4-17 10:14:38

顶一下楼主

clever0725 发表于 2012-4-17 10:40:22

不错 收藏了

beiguoqishi2 发表于 2012-5-12 14:23:16

不能下载,MARK一下回头下

hualuoliuxing 发表于 2012-6-1 16:39:43

论坛不能下附件。能发到我邮箱吗??、??非常需要这个。、、442948742@qq.com          谢谢啊谢谢

gosman 发表于 2012-11-27 21:56:43

请问楼主用的GPS型号是什么?我才接触GPS和STM32 ,不知道选择什么型号的GPS模块……

caizhiwei 发表于 2012-12-20 15:49:30

标记一个,等我做好了循环队列,就贴上来~

sun_sky 发表于 2012-12-20 16:51:34

标记,学习一下

Julius20110 发表于 2012-12-26 15:35:01

{:loveliness:}非常好

SightNeng 发表于 2013-4-3 11:59:54

mark{:lol:}{:lol:}

陌道伊城 发表于 2013-5-1 20:21:25

先顶一下,下载下来看看!

jidianchuchu 发表于 2013-5-28 18:14:16

看一下,谢谢分享

skype 发表于 2013-6-5 18:18:18

楼主的解析方式很好,采用了,再补充一个环形队列吧,方式就是采用hotpower 的uart 零耗时思想,上代码:
typedef struct
{
    uint8_t GPS_data_Count;
    uint8_t Frame;
    uint64_t pd;
    uint64_t pd1;
    uint8_t GPS_Buffer;
    uint8_t *pstr;            //测试
}Gps_data_addr_st;

Gps_data_addr_st Gps_data_addr;

//中断

void UART0_IRQHandler(void)
{
    uint8_t u8InChar=0xFF;
    static uint8_t KeyWord_Count;
    uint32_t u32_IQR= UART0->ISR;
    uint32_t u32_status = UART0->FSR;
    UART0->ISR = u32_IQR;
    //串口接收数据
    if (((_UART_IS_RX_READY(UART0) > 0) || (_UART_IS_RX_TIMEOUT(UART0) > 0)) && (_UART_IS_RX_BUF_ERR(UART0) == 0))
    {
      while(_UART_IS_RX_EMPTY(UART0) == 0)
      {
            __disable_irq();
            _UART_RECEIVEBYTE(UART0, u8InChar);
            Gps_data_addr.GPS_Buffer = u8InChar;       
            switch(u8InChar)
            {   //NEMA0183 格式数据以$开始,\r\n结尾(0x0d 0x0a)
                case '$':
                  Gps_data_addr.pd <<= 8;
                  Gps_data_addr.pd |= '$';//存放'$'
                  Gps_data_addr.pd <<= 8;
                  Gps_data_addr.pd |= Gps_data_addr.GPS_data_Count;//'$'在数组中的下标
                  KeyWord_Count = Gps_data_addr.GPS_data_Count;
                break;
                case 0x0D:
                  Gps_data_addr.pd <<= 8;
                  Gps_data_addr.pd |= 0x0d;//存放0x0d
                  Gps_data_addr.pd <<= 8;
                  Gps_data_addr.pd |= Gps_data_addr.GPS_data_Count;////0x0d在数组中的下标
                  //收完一帧数据,发送GPS解码消息,5us后任务就绪
                  //模拟抢占式任务,串口中断退出后解码可以开始,优先级等同TMR0中断,解码时间必须在14ms内完成
                  if( (Gps_data_addr.GPS_Buffer == 'C') ||      //GPRMC
                        (Gps_data_addr.GPS_Buffer == 'A') ||      //GPGSA
                        (Gps_data_addr.GPS_Buffer == 'V') ||      //GPGSV
                        (Gps_data_addr.GPS_Buffer == 'L') )       //GPGLL
                  {
                        GPS_Decode_Run();//启动TMR1中断
                  }
                  else
                  {
                        Gps_data_addr.pd = 0;
                  }
                break;
                default:    break;
            }
            __enable_irq();       
            Gps_data_addr.GPS_data_Count++;
      }
    }
    else
    {//串口BUFFER数据溢出处理
      while(_UART_IS_RX_EMPTY(UART0) == 0)
      {
            _UART_FLUSH_FIFO(UART0, UART_FCR_TFR_Msk | UART_FCR_RFR_Msk);
            _UART_RECEIVEBYTE(UART0, u8InChar);
      }
    }
}

运行效果:

xiaosi1102 发表于 2013-6-5 19:38:55

这个记下晚上回家看一下

wanyou132 发表于 2013-6-6 22:12:55

这个标记一下

oldbreadman 发表于 2013-7-12 21:46:10

好东西,谢谢楼主分享.

战——ing 发表于 2013-7-13 18:59:31

mark顶一下吧

lklhzu 发表于 2013-10-31 16:40:25

串口开循环队列就要用定时器来控制吗?

LY1208798815 发表于 2013-10-31 19:45:24

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

lklhzu 发表于 2013-11-1 10:27:05

Gavin_GC 发表于 2012-4-16 19:23 static/image/common/back.gif
恩,开始没有想到循环队列,现在做通信一般选择循环队列,然后查找帧头和帧尾(状态机)解析 ...

麻烦能上传一份用串口的循环队列解析GPS的源码吗?

Gavin_GC 发表于 2013-11-1 20:54:15

lklhzu 发表于 2013-11-1 10:27 static/image/common/back.gif
麻烦能上传一份用串口的循环队列解析GPS的源码吗?

这个好久以前做的啦,我没有做循环队列的,你可以参照他们思想修改。我一般是创建一个结构体,定义一个256大小的数组、头指针、尾指针。串口接收中断函数将数据填充的数组里面去,尾指针增加,利用uint8_t数据类型的255+1=0的机制,然后外面函数进行数据的解析,读取数据后头指针进行相应的增加,增加操作最好加入一个强制转换操作(uint8_t)(pStart+1).

lklhzu 发表于 2013-11-2 10:02:14

Gavin_GC 发表于 2013-11-1 20:54 static/image/common/back.gif
这个好久以前做的啦,我没有做循环队列的,你可以参照他们思想修改。我一般是创建一个结构体,定义一个25 ...

谢谢啊,我也按照你说的这种方法试试!

lklhzu 发表于 2013-11-5 10:03:23

Gavin_GC 发表于 2013-11-1 20:54 static/image/common/back.gif
这个好久以前做的啦,我没有做循环队列的,你可以参照他们思想修改。我一般是创建一个结构体,定义一个25 ...

楼主你好,GPRMC这种帧头是在串口中断里面先判断再接收,还是中断里面只接收,主函数里面判断帧头?

tinwy_zhang 发表于 2013-11-12 20:51:26

STM32--GPS解析

ghostxdy 发表于 2013-11-12 22:01:33

之前也写了一个,参考一下LZ的思路

SayBey 发表于 2013-11-21 11:00:22

正要学习这个,看看有用不。。。

wenziheni 发表于 2013-11-29 09:30:13

学习了 收藏

zjk 发表于 2013-12-26 13:37:10

来看看哈。。。

zhangzike 发表于 2014-2-27 09:59:56

thanks 及时雨啊

zlpvch 发表于 2014-3-7 19:32:05

mark一下,我之前也看了各种方法,主要问题是gps信息不定长,正点原子的写得不错,后面为了减轻主控的负担,我用了一个mcu专门来解析gps,解算好了才以固定长度发给主控。

lsz0628 发表于 2014-3-10 14:05:42

Gavin_GC 发表于 2013-11-1 20:54
这个好久以前做的啦,我没有做循环队列的,你可以参照他们思想修改。我一般是创建一个结构体,定义一个25 ...

楼主,可以上传整个工程,让我们学习学习嘛

WERWER 发表于 2014-3-10 23:24:16

给力!!!!!

chengshuo 发表于 2014-3-15 15:56:13

最近要搞GPS,真没搞过,头疼

fiaanull 发表于 2014-4-29 14:29:50


STM32--GPS解析,mark下!{:titter:}

cld795 发表于 2014-5-5 21:31:18

谢谢楼主分享         

chinamaken 发表于 2014-7-10 17:07:46

正好用STM32F105来做GPS信号接收和处理信息,有很大的帮助

tazzf_68 发表于 2014-11-11 21:38:25

谢谢楼主分享!

liao-ljj 发表于 2014-11-11 21:50:39

好东西哦!状态机。。。 有用到的!

fraser 发表于 2014-11-14 15:17:44

谢谢分享!

starsun 发表于 2015-1-22 23:16:13

很好,学习一下

小乖 发表于 2015-7-8 13:45:44

学习了,谢谢~

sml009 发表于 2015-11-19 18:10:07

学习了

戴风海 发表于 2016-1-23 19:03:37

不错 收藏了

aaabbbad 发表于 2016-1-23 19:34:26

学习下,谢谢分享

haimian003 发表于 2016-10-8 17:43:29

标记下,最近正需要
页: [1]
查看完整版本: 基于stm32的GPS解析