STM32GPS定位 NEO_6M

这篇具有很好参考价值的文章主要介绍了STM32GPS定位 NEO_6M。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

  • 目录

    前言:

    一、使用HAL库生成代码

             1、HAL库设置

    二、程序编写

    1.串口

    2.gps.c

           GPS.h

    3、串口1开启接收

    4、main.c

    总结


前言:

使用stm3f103c8t6, GPS是NEO-6M

一、使用HAL库生成代码

         1、HAL库设置

                    选择使用的芯片

                        STM32GPS定位 NEO_6M

                     基础配置及打开串口

    STM32GPS定位 NEO_6M                    

STM32GPS定位 NEO_6M 

STM32GPS定位 NEO_6M 

STM32GPS定位 NEO_6M 

STM32GPS定位 NEO_6M 

STM32GPS定位 NEO_6M 

二、程序编写

1.串口

   串口1用来和电脑通讯,串口2用来和GPS模块通讯,波特率设置为9600

    printf重定向

   在usart.c中添加这个函数

#include "stdio.h"
#include "string.h"

int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
    return ch;
}

/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE * f)
{
    uint8_t ch = 0;
    while(HAL_UART_Receive(&huart1,&ch, 1, 0xffff)!=HAL_OK);
    return ch;
}
串口2波特率为9600
void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;  //这里程序中默认为115200 
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }

}

2.gps.c

代码如下(示例):

#include "gps.h"
#include "stdio.h"     
#include "stdarg.h"     
#include "string.h"     
#include "math.h"


    
//m^n函数
//返回值:m^n次方.
uint32_t NMEA_Pow(uint8_t m,uint8_t n)
{
    uint32_t result=1;     
    while(n--)result*=m;    
    return result;
}

void Andly_GPS(Mgps_msg *Mgps,uint8_t *buf)//解析定位信息
{
    uint16_t i=0,j=0,k=0;
    uint8_t *p1,dx;
    uint32_t temp;
    float rs;
    p1 = strstr((const char *)buf,"RMC");
//    char *json_buff;
    if(buf[0]==0) buf[0]=1;//防止有时候首字节为0 出现解析失败
    buf=strstr((const char *)buf,"RMC");
        if(strstr((const char *)buf,"RMC")!=NULL)
        {
            buf=strstr((const char *)buf,",A");    
            
            i=NMEA_Comma_Pos(buf,2);//第N个逗号所在位置
            j=i;k=i;
            for(i;i<i+10;i++)
            {
                if(buf[i]==',') break;
                Mgps->latitude[i-j]=buf[i];//维度
                if(buf[i]!='.')Mgps->lat[i-k]=buf[i];//维度
                else k=k+1;
            }
            
            i=NMEA_Comma_Pos(buf,1);//第N个逗号所在位置
            j=i;k=i;
            for(i;i<i+20;i++)
            {
                if(buf[i]==',') break;
                Mgps->Location[i-j]=buf[i];//定位A V
                if(buf[i]!='.')Mgps->lat[i-k]=buf[i];//维度
                else k=k+1;
            }
            
            i=NMEA_Comma_Pos(buf,4);//第N个逗号所在位置
            j=i;k=i;
            for(i;i<i+11;i++)
            {
                if(buf[i]==',') break;
                Mgps->longitude[i-j]=buf[i];//经度
                if(buf[i]!='.')Mgps->lon[i-k]=buf[i];//经度
                else k=k+1;
            }
            
        }
    
}
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;     
}

//str转换为数字,以','或者'*'结束
//buf:数字存储区
//dx:小数点位数,返回给调用函数
//返回值:转换后的数值
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;
}

       GPS.h




#ifndef __gps_H
#define __gps_H


#include "main.h"
#include "string.h"
#include "stdio.h"
#include "usart.h"
typedef struct  
{                                            
    uint8_t latitude[10];                //纬度 
    uint8_t longitude[11];            //经度     
    uint8_t Location[1];            //定位有效A 定位无效V 
    
    uint8_t lat[20];                //纬度 
    uint8_t lon[20];

    uint8_t latt;    //经度     
}Mgps_msg; 
extern  Mgps_msg Mgps;




void Andly_GPS(Mgps_msg *Mgps,uint8_t *buf);    
uint8_t NMEA_Comma_Pos(uint8_t *buf,uint8_t cx);
void Gps_Msg_Show(void);//显示GPS定位信息 
int NMEA_Str2num(uint8_t *buf,uint8_t*dx);


#endif 

3、串口1开启接收

void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
{		 
	if(huart->Instance == USART2)
		{
//			HAL_UART_Transmit(&huart1,OTA_buff,1,100);//串口1发送接收buff里的东西	
			HAL_UART_Receive_IT(&huart2,USART2_RX_BUF,1);	//重新开启串口3接收中断
					
			if(USART2_RX_STA<1023)	//还可以接收数据
			{
				
				OTA_buff[USART2_RX_STA]=USART2_RX_BUF[0];	
				USART2_RX_STA++;	//记录接收到的值	
				if(strstr((const char *)OTA_buff,"RMC")!=NULL) 
				{
					GPS_flag =1;//接到RMC
                
				}

 				
			}

		}
}

4、main.c

HAL_UART_Receive_IT(&huart2,USART2_RX_BUF,1);
	  if(GPS_flag ==1){
	  
			Andly_GPS(&Mgps,OTA_buff);	
			char *la= NULL; 
			la = Mgps.latitude;	
			printf("纬度:");			
			printf("\r\n%s\r\n",Mgps.latitude);
			char *lo= NULL;
			lo = Mgps.longitude;
			printf("经度:");
			printf("\r\n%s\n",Mgps.longitude);
			HAL_Delay(100);
	  
	  
	  
	  
	  }

总结

解析到的GPS存放在Mgps.longitude和Mgps.latitude中文章来源地址https://www.toymoban.com/news/detail-403453.html

到了这里,关于STM32GPS定位 NEO_6M的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32读取GPS数据-ATGM336H

    全球四大卫星定位系统     GPS 系统(美国)     BDS 系统(中国北斗)     GLONASS 系统(俄罗斯)     伽利略卫星导航系统(欧盟)     ATGM336H-5N 系列模块是 9.7X10.1 尺寸的高性能 BDS/GNSS 全星座定位导航模块系列的总称。该系列模块产品都是基于中科

    2024年01月25日
    浏览(46)
  • 【开源】ESP32怎样连接NEO6M模块接收GPS数据并显示在oled小屏幕上并可上传数据至Onenet云平台

    esp32连接neo6m在oled上显示定位数据 一.软件部分 安装Arduino 我们可以直接去官网上进行下载 https://www.arduino.cc/en/software 选择第一个 即可开始下载 将Arduino设置为中文,选择File–打开Preferences–language–中文简体 需要安装ESP32库,选择文件–首选项–在其他管理器开发地址写入

    2024年02月04日
    浏览(45)
  • STM32基于HAL解析GPS经度纬度以及时间

    第一步:打开CubeMX工具: 第二步:创建一个工程:搜索一下需要的芯片。  第三步:配置调试器 第四步:配置时钟 第五步: 配置时钟树,在下图所示出输入,点击回车即可。  第六步:配置串口  第七步: 第二部分: 代码编写 第一步:定义一个用于存放经度纬度的缓存

    2024年04月08日
    浏览(66)
  • 物联网毕设 -- 智能拐杖(GPS+WIFI+云平台+STM32)

    目录 前言 一 连线图 1 原理图 2 PCB效果 3 实物效果 4 APP效果 5 功能概括 (1)硬件端 (2)APP端 (3)云平台使用(阿里云)(需要可以找我获取) (4)演示视频 二 底层代码使用方式 1. 使用说明 2. 下载程序 三 APP使用方式 四 程序修改部分 智能拐杖项目结合了硬件端和APP端

    2024年04月16日
    浏览(39)
  • STM32L+BC20+MQTT协议传输温湿度,GPS数据到阿里云物联网平台

    (阿里云)STM32L+BC20+MQTT协议传输温湿度,GPS数据到阿里云物联网 1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内(注意不要弄错方向) 同时接入天

    2024年02月15日
    浏览(56)
  • (EMQX)STM32L+BC20+MQTT协议传输温湿度,ADC,电压,GPS数据到EMQX

    1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡,天线 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内(注意不要弄错方向) 同时接入天线 2.2 连接ST-Link仿真器 用3条杜邦线接入STM32L的 DIO、GND、

    2024年02月16日
    浏览(50)
  • (Onenet)STM32L+BC20+MQTT协议传输温湿度,ADC,电压,GPS数据到Onenet物联网平台

    1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内(注意不要弄错方向) 同时接入天线 2.2 连接ST-Link仿真器 用3条杜邦线接入STM32L的 DIO、GND、CLK中 另

    2024年02月15日
    浏览(43)
  • 声源定位与stm32示例

    stm32串口通信在lcd屏幕上行显示的demo和源码。目标demo板是stm32L4正点原子潘多拉。 声源定位板链接(拍499的,不含stm32板): https://item.taobao.com/item.htm?spm=a230r.1.14.3.5aa62182JiEsFkid=646271484683ns=1abbucket=6#detail 主板的网盘资料【尊敬的超级会员V5】我通过百度网盘分享的文件: 链接

    2023年04月08日
    浏览(35)
  • (阿里云)STM32L+BC20+MQTT协议传输温湿度,ADC,电压,GPS数据到阿里云物联网平台

    1、材料准备 准备以下材料 2、设备连接 2.1 插入物联网卡 首先把BC20核心板从开发板上拆下来 然后将物联卡放置在BC20核心板内 物联卡放置完成将BC20核心板重新插入到开发板内(注意不要弄错方向) 同时接入天线 2.2 连接ST-Link仿真器 用3条杜邦线接入STM32L的 DIO、GND、CLK中 另

    2024年02月16日
    浏览(54)
  • GPS定位原理

    GPS卫星: 卫星定位系统是一种使用卫星对某物进行准确定位的技术,它从最初的定位精度低、不能实时定位、难以提供及时的导航服务,发展到现如今的高精度GPS全球定位系统,实现了在任意时刻、地球上任意一点都可以同时观测到4颗卫星,以便实现导航、定位、授时等功

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包