基于stm32的GPS解析
串口中断接收数据,当接收完6条信息后发送标志位,后台进行解析,先找到对应信息的位置(如$GPRMC);然后采用状态机读取经纬度等信息,点击此处下载 ourdev_700873ZM72A5.rar(文件大小:2K) (原文件名:gps.rar) 看一下,谢谢分享 楼主能发整个工程文件吗? 可以用strstr()和atof和atoi等库函数来写,优化一下结构
另外,接收缓冲区用循环队列来做更好 knliao 发表于 2012-4-6 09:35 static/image/common/back.gif
可以用strstr()和atof和atoi等库函数来写,优化一下结构
另外,接收缓冲区用循环队列来做更好 ...
恩,开始没有想到循环队列,现在做通信一般选择循环队列,然后查找帧头和帧尾(状态机)解析 顶一下楼主 不错 收藏了 不能下载,MARK一下回头下 论坛不能下附件。能发到我邮箱吗??、??非常需要这个。、、442948742@qq.com 谢谢啊谢谢
请问楼主用的GPS型号是什么?我才接触GPS和STM32 ,不知道选择什么型号的GPS模块…… 标记一个,等我做好了循环队列,就贴上来~ 标记,学习一下 {:loveliness:}非常好 mark{:lol:}{:lol:} 先顶一下,下载下来看看! 看一下,谢谢分享 楼主的解析方式很好,采用了,再补充一个环形队列吧,方式就是采用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);
}
}
}
运行效果:
这个记下晚上回家看一下 这个标记一下 好东西,谢谢楼主分享. mark顶一下吧 串口开循环队列就要用定时器来控制吗? {:smile:}{:smile:}{:smile:}{:smile:}{:smile:} Gavin_GC 发表于 2012-4-16 19:23 static/image/common/back.gif
恩,开始没有想到循环队列,现在做通信一般选择循环队列,然后查找帧头和帧尾(状态机)解析 ...
麻烦能上传一份用串口的循环队列解析GPS的源码吗? lklhzu 发表于 2013-11-1 10:27 static/image/common/back.gif
麻烦能上传一份用串口的循环队列解析GPS的源码吗?
这个好久以前做的啦,我没有做循环队列的,你可以参照他们思想修改。我一般是创建一个结构体,定义一个256大小的数组、头指针、尾指针。串口接收中断函数将数据填充的数组里面去,尾指针增加,利用uint8_t数据类型的255+1=0的机制,然后外面函数进行数据的解析,读取数据后头指针进行相应的增加,增加操作最好加入一个强制转换操作(uint8_t)(pStart+1). Gavin_GC 发表于 2013-11-1 20:54 static/image/common/back.gif
这个好久以前做的啦,我没有做循环队列的,你可以参照他们思想修改。我一般是创建一个结构体,定义一个25 ...
谢谢啊,我也按照你说的这种方法试试! Gavin_GC 发表于 2013-11-1 20:54 static/image/common/back.gif
这个好久以前做的啦,我没有做循环队列的,你可以参照他们思想修改。我一般是创建一个结构体,定义一个25 ...
楼主你好,GPRMC这种帧头是在串口中断里面先判断再接收,还是中断里面只接收,主函数里面判断帧头? STM32--GPS解析 之前也写了一个,参考一下LZ的思路 正要学习这个,看看有用不。。。 学习了 收藏 来看看哈。。。 thanks 及时雨啊 mark一下,我之前也看了各种方法,主要问题是gps信息不定长,正点原子的写得不错,后面为了减轻主控的负担,我用了一个mcu专门来解析gps,解算好了才以固定长度发给主控。 Gavin_GC 发表于 2013-11-1 20:54
这个好久以前做的啦,我没有做循环队列的,你可以参照他们思想修改。我一般是创建一个结构体,定义一个25 ...
楼主,可以上传整个工程,让我们学习学习嘛 给力!!!!! 最近要搞GPS,真没搞过,头疼
STM32--GPS解析,mark下!{:titter:} 谢谢楼主分享 正好用STM32F105来做GPS信号接收和处理信息,有很大的帮助 谢谢楼主分享! 好东西哦!状态机。。。 有用到的! 谢谢分享! 很好,学习一下 学习了,谢谢~
学习了 不错 收藏了 学习下,谢谢分享 标记下,最近正需要
页:
[1]