文章目录

  • 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相关推荐

  1. stm32 m5311上传gps数据上onenet云平台实现地图定位

    新手,第一次写博客,如有不足请大家见谅并指出.下面开始正文. 本文是帮一个朋友做一个NB_Iot的小东西这个过程的学习记录吧. NB模块是M5311,然后还有一个stm32f103的最小系统开发板,后 ...

  2. STM32驱动K210人脸识别模块经验汇总

    本次是基于HLK-KT210 AI人脸识别模块和STM32单片机进行设计的人脸识别项目.主要是人脸识别功能的分析和使用. 1 模块连接 本次使用了海凌科生产的DEMO板,但是由于板子的客观因素,TTL ...

  3. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

  4. stm32官方例程在哪找_正点原子Linux第十一章模仿STM32驱动开发格式实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十一章模仿STM32驱动开发格式实验 在上一章使用C语 ...

  5. 4.4 使用STM32控制MC20进行GPS帧数据解析

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  6. ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)

    参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...

  7. stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)

    RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...

  8. STM32驱动LCD实战

    目录 01 驱动时序 02 FSMC外设配置 03 背光驱动 04 复位驱动 05 寄存器配置 前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文 ...

  9. STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...

最新文章

  1. 57条经验之谈 转载(非常不错,我收藏了)
  2. golang map 删除 清空
  3. 电感发出声音怎么解决_开关电源有“声音”可以这样解决-电源啸叫解决方案...
  4. python作品_Python爬取图虫网摄影作品
  5. python 机器学习管道_构建机器学习管道-第1部分
  6. Confluence 6 自定义 Decorator 模板的宏和针对高级用户
  7. hadoop3.2.2--记录java.io.IOException: All specified directories have failed to load.问题
  8. C++ std::thread
  9. python中文视频教程-python中文视频教程(全38集)
  10. 学考计算机删除键是什么字母,考计算机的童鞋注意啦~计算机基础题答案~
  11. 简单的嵌入式人脸识别系统
  12. 《大型网站技术架构-核心原理与案例分析》(李智慧 著)第2章-大型网站架构模式
  13. 你想要的宏基因组-微生物组知识全在这(19国庆特别篇)
  14. 戴尔计算机无法安装Win10,教您戴尔无法开机如何重装win10
  15. 解决React Navigation goBack()无效
  16. 智能车图像处理-阳光算法
  17. 《九日集训》打卡第二天
  18. TP6基础知识【新框架】
  19. awvs安装及问题解决
  20. YOLOv5+BiSeNet——同时进行目标检测和语义分割

热门文章

  1. FME里的查询替换转换器(一)
  2. 基于华为云虚拟机搭建方舟:生存进化私服(ARK Server Manager)教程
  3. LPC1768的usb使用--硬件篇
  4. 几个非常经典的对“数据仓库”的解释(ZT)
  5. 计算机网络实验教程钱德沛_计算机网络实验教程 雷震甲.pdf
  6. 数据结构 --静态队列的一个简单的C语言代码实现
  7. python生成字符图形_【Python AsciiArt】利用命令行打印出字符图案
  8. java获取扫描枪的数据到数据库
  9. 坚持不下去怎么办?这些好用的懒人听书APP,专治没有毅力的你
  10. cf游戏介绍模板html,2016CFYY游戏频道设计模板