STM32Ccubemx-H7-24-GPS模块-ATGM336H-5N卫星导航模块

模块简介

我们今天主要使用这个模块来获取经纬度 ,使用串口通讯

主要解决

1.串口通讯的不定时长接收

2.数据包的解析

C语言程序测试

首先用串口接收

这个是使用串口助手接收到的数值

交给豆包分析

可以看出,豆包只需要根据

cpp 复制代码
$GNRMC,093039.000,A,2503.87572,N,11017.71239,E,0.00,17.26,221125,,,A,V*3C

这一包就可以计算出经纬度,所以我们需要只需要获取这一包然后解析这一包

DevC++测试

cpp 复制代码
#include <stdio.h>
#include <string.h>
typedef int uint8_t;
static char data[2][30];
static float jing, wei;
static uint8_t lentgth;
char ss[100] = "$GNRMC,093040.000,A,2503.87566,N,11017.71241,E,0.00,17.26,221125,,,A,V*38";
//$GNRMC,093040.000,A,2503.87566,N,11017.71241,E,0.00,17.26,221125,,,A,V*38
void change_buff()
{
	char *p = ss;
	uint8_t i = 0;
	uint8_t j = 0;
	while (i < lentgth)
	{
		if (*(p + i) == '$')
		{
			if (*(p + i + 1) == 'G' && *(p + i + 2) == 'N' && *(p + i + 3) == 'R' && *(p + i + 4) == 'M' && *(p + i + 5) == 'C')
			{
				j = 0;
				while (j != 3)
				{
					i++;
					if (*(p + i) == ',')
					{
						j++;
					}
				}
				i++;
				j = 0;
				while (*(p + i) != ',')
				{
					data[0][j++] = *(p + i++);
				}
				data[0][j] = '\0';
				while (*(p + i) != ',')
				{
					i++;
				}
				i += 3;
				j = 0;
				while (*(p + i) != ',')
				{
					data[1][j++] = *(p + i++);
				}
				data[1][j] = '\0';
				break;
			}
		}
		i++;
	}
}

void handle_data(char *da, float *hh)
{
	uint8_t i = 0, j = 0, k, zz = 0, xz = 0, yz = 0;
	float x = 0;
	while (da[i] != '\0')
	{
		if (da[i] == '.')
		{
			j = i;
			break;
		}
		i++;
	}
	xz = (da[j - 2] - '0') * 10 + (da[j - 1] - '0');
	k = j - 2;
	i = 0;
	while (i < k)
	{
		zz *= 10;
		zz += (da[i++] - '0');
	}
	i = j + 1;
	k = 3;
	while (k--)
	{
		yz *= 10;
		yz += (da[i++] - '0');
	}
	x = ((float)xz + (float)yz / 1000) / 60.0;
	*hh = (float)zz + x;
}
int main()
{
	lentgth = strlen(ss);
	change_buff();
	handle_data(data[0], &jing);
	handle_data(data[1], &wei);
	printf("精度=%.3f,纬度=%.3f\n", jing, wei);
	return 0;
}

测试结果如下,成功解算出来

所以根据上述原理放入程序中即可成功解算

源代码

gps.c

cpp 复制代码
#include "gps.h"
#include "usart.h"
#include "tim.h"
#include "stdio.h"
static char gps_buffer[100], gps_data[2][50];
static uint8_t gps_buff[1], length = 0, time = 0, wflagh = 0, debug = 0;
static float longitude, latitude;

void GPS_Init(void)
{
    HAL_UART_Receive_IT(&gps_uart, (uint8_t *)gps_buff, 1);
    HAL_TIM_Base_Start_IT(&gps_tim);
}

void GPS_Data(float *data1, float *data2)
{
    *data1 = longitude;
    *data2 = latitude;
}

static void handle_data(char *da, float *hh)
{
    uint8_t i = 0, j = 0, k, zz = 0, xz = 0, yz = 0;
    float x = 0;
    while (da[i] != '\0')
    {
        if (da[i] == '.')
        {
            j = i;
            break;
        }
        i++;
    }
    if (debug)
        printf("come6\r\n");
    xz = (da[j - 2] - '0') * 10 + (da[j - 1] - '0');
    k = j - 2;
    i = 0;
    while (i < k)
    {
        zz *= 10;
        zz += (da[i++] - '0');
    }
    i = j + 1;
    k = 3;
    if (debug)
        printf("come7\r\n");
    while (k--)
    {
        yz *= 10;
        yz += (da[i++] - '0');
    }
    if (debug)
        printf("come8\r\n");
    x = ((float)xz + (float)yz / 1000) / 60.0;
    *hh = (float)zz + x;
    if (debug)
        printf("hh=%f\r\n", *hh);
}

static void change_buff()
{
    char *p = gps_buffer;
    uint8_t i = 0;
    uint8_t j = 0;
    while (i < length)
    {
        if (*(p + i) == '$')
        {
            if (*(p + i + 1) == 'G' && *(p + i + 2) == 'N' && *(p + i + 3) == 'R' && *(p + i + 4) == 'M' && *(p + i + 5) == 'C')
            {
                j = 0;
                if (debug)
                    printf("come1\r\n");
                while (j != 3)
                {
                    i++;
                    if (*(p + i) == ',')
                    {
                        j++;
                    }
                }
                if (debug)
                    printf("come2\r\n");
                i++;
                j = 0;
                while (*(p + i) != ',')
                {
                    gps_data[0][j++] = *(p + i++);
                }
                gps_data[0][j] = '\0';
                if (debug)
                    printf("come3\r\n");
                while (*(p + i) != ',')
                {
                    i++;
                }
                i += 3;
                j = 0;
                if (debug)
                    printf("come4\r\n");
                while (*(p + i) != ',')
                {
                    gps_data[1][j++] = *(p + i++);
                }
                if (debug)
                    printf("come5\r\n");
                gps_data[1][j] = '\0';
                handle_data(gps_data[0], &longitude);
                handle_data(gps_data[1], &latitude);
                return;
            }
            else
            {
                return;
            }
        }
        i++;
    }
}

void gps_uart_handle(void)
{
    if (wflagh == 0)
    {
        gps_buffer[length++] = gps_buff[0];
        time = 0;
    }
    HAL_UART_Receive_IT(&gps_uart, (uint8_t *)gps_buff, 1);
}

void gps_tim_handle(void)
{
    if (wflagh == 0)
    {
        time++;
        if ((time >= 5) && (length > 0))
        {
            wflagh = 1;
        }
    }
}

void gps_while()
{
    if (wflagh == 1)
    {
        gps_buffer[length] = '\0';
        if (debug)
            printf("%s\r\n", gps_buffer);
        change_buff();
        length = 0;
        time = 0;
        wflagh = 0;
    }
}

gps.h

cpp 复制代码
#ifndef __GPS_H
#define __GPS_H

#include "main.h"

#define gps_uart huart1
#define gps_tim htim2
#define gps_buffer_size 255

void GPS_Init(void);
void GPS_Data(float *data1, float *data2);
void gps_uart_handle(void);
void gps_tim_handle(void);
void gps_while(void);
#endif

结果验证

通过放在户外连接

最后也是成功实现功能

相关推荐
bai5459362 小时前
STM32 常用数据类型
stm32·单片机·嵌入式硬件
d111111111d5 小时前
关于STM32的选项字节的问题:如果我通过操作指针把数据写在了单片机的选项字节区域那么换别的程序时候数据会进行变化吗?
笔记·stm32·单片机·嵌入式硬件·学习
steins_甲乙7 小时前
stm32入门篇2
stm32·单片机·嵌入式硬件
一枝小雨9 小时前
单片机内存布局管理:sct分散加载详解
stm32·单片机·嵌入式·编译链接·sct分散加载·单片机内存布局
小尧嵌入式10 小时前
基于HAL库实现ETH以太网
网络·arm开发·stm32·单片机·嵌入式硬件
逼子格11 小时前
硬件工程师成长之路——知识汇总(持续更新)
嵌入式硬件·proteus·硬件工程·ad·keil·电路仿真·硬件工程师面试
飞凌嵌入式12 小时前
飞凌嵌入式RK3568开发板的TFTP烧写文件系统指南
linux·嵌入式硬件·嵌入式
lingzhilab18 小时前
零知IDE——基于STM32F103RBT6与RFID-RC522的校园餐卡系统实现
stm32·单片机·嵌入式硬件
promising-w18 小时前
【stm32入门教程】GPIO输入之按键控制LED&光敏传感器控制蜂鸣器
stm32·单片机·嵌入式硬件