stm32驱动GT-U7 GPS
文章目录
- STM32驱动GT-U7 GPS模块
- 一些参数
- 用户手册
- 过程
- 问题
- 代码
STM32驱动GT-U7 GPS模块
- 淘宝链接:GT-U7 GPS
一些参数
可到淘宝链接上查看。(因为放的是图片,审核时认为是广告)
用户手册
4,$GPRMC(推荐定位信息,Recommended Minimum Specific GPS/Transit Data) $GPRMC 语句的基本格式如下: $GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
(1) UTC 时间,hhmmss(时分秒)
(2) 定位状态,A=有效定位,V=无效定位
(3) 纬度 ddmm.mmmmm(度分)
(4) 纬度半球 N(北半球)或 S(南半球)
(5) 经度 dddmm.mmmmm(度分)
(6) 经度半球 E(东经)或 W(西经)
(7) 地面速率(000.0~999.9 节)
(8) 地面航向(000.0~359.9 度,以真北方为参考基准)
(9) UTC 日期,ddmmyy(日月年)
(10) 磁偏角(000.0~180.0 度,前导位数不足则补 0)
(11) 磁偏角方向,E(东)或 W(西)
(12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
举例如下: $GPRMC,023543.00,A,2308.28715,N,11322.09875,E,0.195,240213,A*78
过程
我用串口DMA中断一直读取不到正确的数据,后来去看底层usart.h才发现原来是我波特率搞错了。我把波特率设置为了38400,而正确的应该是9600,这就导致我读取的的数据一直没有其实帧($),所以就一直卡在这里。
改好了波特率以后问题解决,接下来需要对数据处理一下,毕竟数据有点漂(精度2.5m)。
问题
搜星速度有点慢,通信稳定的基础上反馈频率1s一次,感觉有点慢,不过精度感觉还行。等下去室外试看一下。
代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//采用串口DMA中断
{if(huart == &huart1){static int i = 0;HAL_UART_Receive_DMA(&huart1,&GPS_begin,1);i++;if(GPS_begin == '$')//判断起始帧{ i = 0;single = 1;}GPS_data[i] = GPS_begin;if(i == 67){single = 1; }}
}
gps.h文件
#ifndef _GPS_H_
#define _GPS_H_#include "stm32f1xx.h"__packed typedef struct
{ uint8_t num; uint8_t eledeg; uint16_t azideg; uint8_t sn;
}nmea_slmsg; __packed typedef struct
{ uint16_t year; uint8_t month; uint8_t date; uint8_t hour; uint8_t min; uint8_t sec;
}nmea_utc_time; __packed typedef struct
{ uint8_t svnum; nmea_slmsg slmsg[12]; nmea_utc_time utc; uint32_t latitude; uint8_t nshemi; uint32_t longitude; uint8_t ewhemi; uint8_t gpssta; uint8_t posslnum; uint8_t possl[12]; uint8_t fixmode; uint16_t pdop; uint16_t hdop; uint16_t vdop; int altitude; uint16_t speed;
}nmea_msg; extern nmea_msg GPSX;void GPS_Analysis(nmea_msg *gpsx,uint8_t *buf);
void NMEA_GPRMC_Analysis(nmea_msg *gpsx,uint8_t *buf);#endif
gps.c文件(里面是ASICC码的注释,所以乱码)
#include "gps.h"
#include "string.h"nmea_msg GPSX;uint8_t NMEA_Comma_Pos(uint8_t *buf,uint8_t cx)
{ uint8_t *p=buf;while(cx){if(*buf=='*'||*buf<' '||*buf>'z')return 0XFF;//Óöµ½'*'»òÕß·Ç·¨×Ö·û,Ôò²»´æÔÚµÚcx¸ö¶ººÅif(*buf==',')cx--;buf++;}return buf-p;
}uint32_t NMEA_Pow(uint8_t m,uint8_t n)
{uint32_t result=1; while(n--)result*=m; return result;
}int NMEA_Str2num(uint8_t *buf,uint8_t*dx)
{uint8_t *p=buf;uint32_t ires=0,fres=0;uint8_t ilen=0,flen=0,i;uint8_t mask=0;int res;while(1) //µÃµ½ÕûÊýºÍСÊýµÄ³¤¶È{if(*p=='-'){mask|=0X02;p++;}//ÊǸºÊýif(*p==','||(*p=='*'))break;//Óöµ½½áÊøÁËif(*p=='.'){mask|=0X01;p++;}//Óöµ½Ð¡ÊýµãÁËelse if(*p>'9'||(*p<'0')) //ÓзǷ¨×Ö·û{ ilen=0;flen=0;break;} if(mask&0X01)flen++;else ilen++;p++;}if(mask&0X02)buf++; //È¥µô¸ººÅfor(i=0;i<ilen;i++) //µÃµ½ÕûÊý²¿·ÖÊý¾Ý{ ires+=NMEA_Pow(10,ilen-1-i)*(buf[i]-'0');}if(flen>5)flen=5; //×î¶àÈ¡5λСÊý*dx=flen; //СÊýµãλÊýfor(i=0;i<flen;i++) //µÃµ½Ð¡Êý²¿·ÖÊý¾Ý{ fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');} res=ires*NMEA_Pow(10,flen)+fres;if(mask&0X02)res=-res; return res;
}
//·ÖÎöGPGSVÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void NMEA_GPGSV_Analysis(nmea_msg *gpsx,uint8_t *buf)
{uint8_t *p,*p1,dx;uint8_t len,i,j,slx=0;uint8_t posx; p=buf;p1=(uint8_t*)strstr((const char *)p,"$GPGSV");len=p1[7]-'0'; //µÃµ½GPGSVµÄÌõÊýposx=NMEA_Comma_Pos(p1,3); //µÃµ½¿É¼ûÎÀÐÇ×ÜÊýif(posx!=0XFF)gpsx->svnum=NMEA_Str2num(p1+posx,&dx);for(i=0;i<len;i++){ p1=(uint8_t*)strstr((const char *)p,"$GPGSV"); for(j=0;j<4;j++){ posx=NMEA_Comma_Pos(p1,4+j*4);if(posx!=0XFF)gpsx->slmsg[slx].num=NMEA_Str2num(p1+posx,&dx); //µÃµ½ÎÀÐDZàºÅelse break; posx=NMEA_Comma_Pos(p1,5+j*4);if(posx!=0XFF)gpsx->slmsg[slx].eledeg=NMEA_Str2num(p1+posx,&dx);//µÃµ½ÎÀÐÇÑö½Ç else break;posx=NMEA_Comma_Pos(p1,6+j*4);if(posx!=0XFF)gpsx->slmsg[slx].azideg=NMEA_Str2num(p1+posx,&dx);//µÃµ½ÎÀÐÇ·½Î»½Çelse break; posx=NMEA_Comma_Pos(p1,7+j*4);if(posx!=0XFF)gpsx->slmsg[slx].sn=NMEA_Str2num(p1+posx,&dx); //µÃµ½ÎÀÐÇÐÅÔë±Èelse break;slx++; } p=p1+1;//Çл»µ½ÏÂÒ»¸öGPGSVÐÅÏ¢}
}
//·ÖÎöGPGGAÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void NMEA_GPGGA_Analysis(nmea_msg *gpsx,uint8_t *buf)
{uint8_t *p1,dx; uint8_t posx; p1=(uint8_t*)strstr((const char *)buf,"$GPGGA");posx=NMEA_Comma_Pos(p1,6); //µÃµ½GPS״̬if(posx!=0XFF)gpsx->gpssta=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,7); //µÃµ½ÓÃÓÚ¶¨Î»µÄÎÀÐÇÊýif(posx!=0XFF)gpsx->posslnum=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,9); //µÃµ½º£°Î¸ß¶Èif(posx!=0XFF)gpsx->altitude=NMEA_Str2num(p1+posx,&dx);
}void NMEA_GPRMC_Analysis(nmea_msg *gpsx,uint8_t *buf)
{uint8_t *p1,dx; uint8_t posx; uint32_t temp; float rs; p1=(uint8_t*)strstr((const char *)buf,"GPRMC");//"$GPRMC",¾³£ÓÐ&ºÍGPRMC·Ö¿ªµÄÇé¿ö,¹ÊÖ»ÅжÏGPRMC.posx=NMEA_Comma_Pos(p1,1); //µÃµ½UTCʱ¼äif(posx!=0XFF){temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx); //µÃµ½UTCʱ¼ä,È¥µômsgpsx->utc.hour=temp/10000;gpsx->utc.min=(temp/100)%100;gpsx->utc.sec=temp%100; } posx=NMEA_Comma_Pos(p1,3); //µÃµ½Î³¶Èif(posx!=0XFF){temp=NMEA_Str2num(p1+posx,&dx); gpsx->latitude=temp/NMEA_Pow(10,dx+2); //µÃµ½¡ãrs=temp%NMEA_Pow(10,dx+2); //µÃµ½' gpsx->latitude=gpsx->latitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//ת»»Îª¡ã }posx=NMEA_Comma_Pos(p1,4); //ÄÏγ»¹ÊDZ±Î³ if(posx!=0XFF)gpsx->nshemi=*(p1+posx); posx=NMEA_Comma_Pos(p1,5); //µÃµ½¾¶Èif(posx!=0XFF){ temp=NMEA_Str2num(p1+posx,&dx); gpsx->longitude=temp/NMEA_Pow(10,dx+2); //µÃµ½¡ãrs=temp%NMEA_Pow(10,dx+2); //µÃµ½' gpsx->longitude=gpsx->longitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//ת»»Îª¡ã }posx=NMEA_Comma_Pos(p1,6); //¶«¾»¹ÊÇÎ÷¾if(posx!=0XFF)gpsx->ewhemi=*(p1+posx); posx=NMEA_Comma_Pos(p1,9); //µÃµ½UTCÈÕÆÚif(posx!=0XFF){temp=NMEA_Str2num(p1+posx,&dx); //µÃµ½UTCÈÕÆÚgpsx->utc.date=temp/10000;gpsx->utc.month=(temp/100)%100;gpsx->utc.year=2000+temp%100; }
}
void NMEA_GPGSA_Analysis(nmea_msg *gpsx,uint8_t *buf)
{uint8_t *p1,dx; uint8_t posx; uint8_t i; p1=(uint8_t*)strstr((const char *)buf,"$GPGSA");posx=NMEA_Comma_Pos(p1,2); //µÃµ½¶¨Î»ÀàÐÍif(posx!=0XFF)gpsx->fixmode=NMEA_Str2num(p1+posx,&dx); for(i=0;i<12;i++) //µÃµ½¶¨Î»ÎÀÐDZàºÅ{posx=NMEA_Comma_Pos(p1,3+i); if(posx!=0XFF)gpsx->possl[i]=NMEA_Str2num(p1+posx,&dx);else break; } posx=NMEA_Comma_Pos(p1,15); //µÃµ½PDOPλÖþ«¶ÈÒò×Óif(posx!=0XFF)gpsx->pdop=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,16); //µÃµ½HDOPλÖþ«¶ÈÒò×Óif(posx!=0XFF)gpsx->hdop=NMEA_Str2num(p1+posx,&dx); posx=NMEA_Comma_Pos(p1,17); //µÃµ½VDOPλÖþ«¶ÈÒò×Óif(posx!=0XFF)gpsx->vdop=NMEA_Str2num(p1+posx,&dx);
}
void NMEA_GPVTG_Analysis(nmea_msg *gpsx,uint8_t *buf)
{uint8_t *p1,dx; uint8_t posx; p1=(uint8_t*)strstr((const char *)buf,"$GPVTG"); posx=NMEA_Comma_Pos(p1,7); //µÃµ½µØÃæËÙÂÊif(posx!=0XFF){gpsx->speed=NMEA_Str2num(p1+posx,&dx);if(dx<3)gpsx->speed*=NMEA_Pow(10,3-dx); //È·±£À©´ó1000±¶}
} //ÌáÈ¡NMEA-0183ÐÅÏ¢
//gpsx:nmeaÐÅÏ¢½á¹¹Ìå
//buf:½ÓÊÕµ½µÄGPSÊý¾Ý»º³åÇøÊ×µØÖ·
void GPS_Analysis(nmea_msg *gpsx,uint8_t *buf)
{NMEA_GPGSV_Analysis(gpsx,buf); //GPGSV½âÎöNMEA_GPGGA_Analysis(gpsx,buf); //GPGGA½âÎö NMEA_GPGSA_Analysis(gpsx,buf); //GPGSA½âÎöNMEA_GPRMC_Analysis(gpsx,buf); //GPRMC½âÎöNMEA_GPVTG_Analysis(gpsx,buf); //GPVTG½âÎö
}
stm32驱动GT-U7 GPS相关推荐
- stm32 m5311上传gps数据上onenet云平台实现地图定位
新手,第一次写博客,如有不足请大家见谅并指出.下面开始正文. 本文是帮一个朋友做一个NB_Iot的小东西这个过程的学习记录吧. NB模块是M5311,然后还有一个stm32f103的最小系统开发板,后 ...
- STM32驱动K210人脸识别模块经验汇总
本次是基于HLK-KT210 AI人脸识别模块和STM32单片机进行设计的人脸识别项目.主要是人脸识别功能的分析和使用. 1 模块连接 本次使用了海凌科生产的DEMO板,但是由于板子的客观因素,TTL ...
- 关于STM32驱动DS1302实时时钟的一点思考
关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...
- stm32官方例程在哪找_正点原子Linux第十一章模仿STM32驱动开发格式实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十一章模仿STM32驱动开发格式实验 在上一章使用C语 ...
- 4.4 使用STM32控制MC20进行GPS帧数据解析
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)
参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...
- stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)
RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...
- STM32驱动LCD实战
目录 01 驱动时序 02 FSMC外设配置 03 背光驱动 04 复位驱动 05 寄存器配置 前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文 ...
- STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...
最新文章
- 57条经验之谈 转载(非常不错,我收藏了)
- golang map 删除 清空
- 电感发出声音怎么解决_开关电源有“声音”可以这样解决-电源啸叫解决方案...
- python作品_Python爬取图虫网摄影作品
- python 机器学习管道_构建机器学习管道-第1部分
- Confluence 6 自定义 Decorator 模板的宏和针对高级用户
- hadoop3.2.2--记录java.io.IOException: All specified directories have failed to load.问题
- C++ std::thread
- python中文视频教程-python中文视频教程(全38集)
- 学考计算机删除键是什么字母,考计算机的童鞋注意啦~计算机基础题答案~
- 简单的嵌入式人脸识别系统
- 《大型网站技术架构-核心原理与案例分析》(李智慧 著)第2章-大型网站架构模式
- 你想要的宏基因组-微生物组知识全在这(19国庆特别篇)
- 戴尔计算机无法安装Win10,教您戴尔无法开机如何重装win10
- 解决React Navigation goBack()无效
- 智能车图像处理-阳光算法
- 《九日集训》打卡第二天
- TP6基础知识【新框架】
- awvs安装及问题解决
- YOLOv5+BiSeNet——同时进行目标检测和语义分割
热门文章
- FME里的查询替换转换器(一)
- 基于华为云虚拟机搭建方舟:生存进化私服(ARK Server Manager)教程
- LPC1768的usb使用--硬件篇
- 几个非常经典的对“数据仓库”的解释(ZT)
- 计算机网络实验教程钱德沛_计算机网络实验教程 雷震甲.pdf
- 数据结构 --静态队列的一个简单的C语言代码实现
- python生成字符图形_【Python AsciiArt】利用命令行打印出字符图案
- java获取扫描枪的数据到数据库
- 坚持不下去怎么办?这些好用的懒人听书APP,专治没有毅力的你
- cf游戏介绍模板html,2016CFYY游戏频道设计模板