038——基于STM32和I.MX6uLL实现uart控制GPS(失败者总结)

news2024/10/7 12:18:04

目录

1、GPS模块简介

2、GPS数据格式

3、方案梳理


1、GPS模块简介

        全球定位系统(Global Positioning System, GPS)是一种以空中卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息。 GPS 主要由三大组成部分:空间部分、地面监控部分和用户设备部分。 GPS 系统具有高精度、全天候、用广泛等特点。
        太空卫星部分由多颗卫星组成,分成多个轨道,绕行地球一周约 12 小时。每个卫星均持续发射载有卫星轨道数据及时间的无线电波,提供地球上的各种接收机来应用。
        地面管制部分,这是为了追踪及控制太空卫星运行所设置的地面管制站,主要工作为负责修正与维护每个卫星能够正常运转的各项参数数据,以确保每个卫星都能够提供正确的讯息给使用者接收机来接收使用者接收机(即用户设备),追踪所有的 GPS 卫星,并实时的计算出接收机所在位置的坐标、移动速度及时间。我们日常接触到的是用户设备部分,这里使用到的 GPS 模块即为用户设备接收机部分。

        GPS 模块与外部控制器的通讯接口有多种方式,这里我们使用串口进行通讯,波特率为 9600bps,1bit 停止位,无校验位,无流控,默认每秒输出一次标准格式数据。

2、GPS数据格式

        GPS 使用多种标准数据格式,目前最通用的 GNSS 格式是 NMEA0183 格式。NMEA0183 是最终定位格式,即将二进制定位格式转为统一标准定位格式,与卫星类型无关。这是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的 ASCII 格式,逗点隔开数据流,数据流长度从 30-100 字符不等,通常以每秒间隔持续输出。
        NVMEA0183 格式主要针对民用定位导航,与专业 RTCM2.3/3.0 和 CMR+的GNSS 数据格式不同。通过 NMEA0183 格式,可以实现 GNSS 接收机与 PC 或 PDA之间的数据交换,可以通过 USB 和 COM 口等通用数据接口进行数据传输,其兼容性高,数据传输稳定。这里我们使用串口进行是通讯,通信框图如下图所示。

图片去看韦老师的图,我这就不放了,这东西科普作用不是今天的重点。

        我们使用串口接收数据,收到的数据包含: $GPGGA( GPS 定位数据)、 $GPGLL
(地理定位信息)、 $GPGSA(当前卫星信息)、 $GPGSV(可见卫星状态信息)、$GPRMC(推荐最小定位信息)、 $GPVTG(地面速度信息)。这里我们只分析$GPGGA (Global Positioning System Fix Data)即可,它包含了 GPS 定位经纬度、质量因子、 HDOP、高程、参考站号等字段。其标准格式如下

$GPGGA, <1>, <2>, <3>, <4>, <5>, <6>, <7>, <8>, <9>, M, <10>, M, <11>, <12>*hh<CR><LF>


$XXGGA 语句各字段的含义和取值范围各字段的含义和取值范围见下表所示,
XX 取值有:
◼ GPGGA:单 GPS
◼ BDGGA:单北斗
◼ GLGGA:单 GLONASS
◼ GNGGA:多星联合定位

3、方案梳理

        为什么会有这个东西,因为GPS只能在户外用。喵的我没法演示所以我想个办法把他用上咋用呢就是看图

        这样我把32拿到户外然后通过zigbee发给6ull就完美解决了。有人说为啥不直接把6ull拿户外呢。没法供电呀DC供电8~12V的。我不想在搭进去个供电模块。

代码我啪的一下就写完了哈哈测试一下

斯乱码。

拿外面试试

据说数据格式应该是这样滴

但是我们全是FF和99就离谱

现在是直接转发的我修改下程序试试

经过我的不懈努力,不调了气死了

直接怼串口拿到室外都不好使

不过32的代码还是给大家做个参考吧

不是代码的问题是硬件问题。

/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/usart/bsp_debug_usart.h"
#include "bsp/usart/bsp_usartx.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/i2c/bsp_i2c_OLED.h"
#include "bsp/led/bsp_led.h"
#include <stdlib.h>
#include <string.h>



/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/

uint8_t Rxflag=0;
char ucTemp;
uint16_t usRxCount;
char ucaRxBuf[256];

u32 send_data()
{
	char tmp[10];
	char *time, *lat, *ns, *lng, *ew;
	float fLat, fLng;
    char Lat[100];
	char Lng[100];
	
	if (ucaRxBuf[0] != '$')
	{
		printf("\r\n  $ >>> %s\r\n",ucaRxBuf);
		usRxCount = 0;
		memset(ucaRxBuf,0,256);
		return 1;
	}
	else if (strncmp(ucaRxBuf+3, "GGA", 3) != 0)
	{
		printf("\r\n  GGA >>> %s\r\n",ucaRxBuf);
		usRxCount = 0;
		memset(ucaRxBuf,0,256);
		return 1;
	}
	else if (strstr(ucaRxBuf, ",,,,,"))
	{
		printf("Place the GPS to open area\r\n");
		printf("\r\n  ,,,,,, >>> %s\r\n",ucaRxBuf);
		usRxCount = 0;
		memset(ucaRxBuf,0,256);
		return 1;
	}
	else {
		printf("raw data: %s\r\n", ucaRxBuf);
//		sscanf(ucaRxBuf, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]", tmp, time, lat, ns, lng, ew);
//	    printf("Time : %s\n", time);
//		printf("ns   : %s\n", ns);
//		printf("ew   : %s\n", ew);
//		printf("Lat  : %s\n", Lat);
//		printf("Lng  : %s\n", Lng);

//		/* 纬度格式: ddmm.mmmm */
//		sscanf(Lat+2, "%f", &fLat);
//		fLat = fLat / 60;
//		fLat += (Lat[0] - '0')*10 + (Lat[1] - '0');

//		/* 经度格式: dddmm.mmmm */
//		sscanf(Lng+3, "%f", &fLng);
//		fLng = fLng / 60;
//		fLng += (Lng[0] - '0')*100 + (Lng[1] - '0')*10 + (Lng[2] - '0');
//		printf("Lng,Lat: %.06f,%.06f\n", fLng, fLat);

		return 0;
	}
}

void read_data()
{
	int i = 0;
	int start = 0;
	
	while (1)
	{
		if(Rxflag)
		{
			if (ucTemp == '$')
				start = 1;
		    if (start)
			{
				ucaRxBuf[i++] = ucTemp;
			}
			if(i == 255)
			{
                i =0;			
				printf("%s", ucaRxBuf);
			
			}
			/* 遇到换行字符,认为接收到一个命令 */
//			if (ucTemp == '\n' || ucTemp == '\r')	/* 换行字符 */
//			{
//				send_data();
//				usRxCount = 0;
//				//memset(ucaRxBuf,0,256);
//			}
			Rxflag=0;
		}
	}
}

/**
  * 函数功能: 主函数.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
int main(void)
{   

	/* 简单的通信协议,遇到回车换行符认为1个命令帧 */  
	
	/* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */
	DEBUG_USART_Init(); 
	USARTx_Init();
	/* 初始化系统滴答定时器 */  
	SysTick_Init();
	OLED_Init();
	LED_GPIO_Init();
	/* 无限循环 */
	while (1)
	{
		   	/** 
			* 接收串口的数据,分析并处理 
			* 可以将此段代码封装为一个函数,在主程序其它流程调用
		  */
        read_data();
	}
}

/******************************************************************************/
/*                 STM32F10x Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f10x_xx.s).                                            */
/******************************************************************************/
void USARTx_IRQHANDLER(void)
{
	if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
	{ 	
		Rxflag=1;		
		ucTemp = USART_ReceiveData(USARTx);
	} 
	 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1637726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目运行到手机端

运行到真机 手机和点到连在同一个wifi网络下面点击hbuiler上面的预览得到一个&#xff0c;network的网址这个时候去在手机访问&#xff0c;那么就可以访问网页了 跨域处理 这个时候可能会访问存在跨域问题 将uniapp的H5版本运行到真机进行调试&#xff0c;主要涉及到跨域问题…

开源农场管理软件

软件介绍 Tania是一款基于Go、Vue.JS和SQLite的开源农场日记软件。该项目始于2016年11月&#xff0c;由于无法找到适合自己需求的软件&#xff0c;开发团队决定自己搭建一套适合家庭后院花园的管理系统&#xff0c;并可以随时随地进行管理。 项目功能描述 Tania是一款免费且开源…

MySQL——88张表汇总——DDL+外键

外键er图 88张表 /* Navicat MySQL Data TransferSource Server : MyList Source Server Version : 50726 Source Host : localhost:3309 Source Database : schooldbTarget Server Type : MYSQL Target Server Version : 50726 File Encoding …

YOLOV8添加SKATTENTION

修改ultralytics.nn.modules._init_.py https://zhuanlan.zhihu.com/p/474599120?utm_sourcezhihu&utm id0 https://blog.csdn.net/weixin 42878111/article/details/136060087 https://blog.csdn.net/gg 51511878/aricle/details/138002223 . 最后输出层不一样。

【学习AI-相关路程-工具使用-NVIDIA SDK MANAGER==NVIDIA-jetson刷机工具安装使用 】

【学习AI-相关路程-工具使用-NVIDIA SDK manager-NVIDIA-jetson刷机工具安装使用 】 1、前言2、环境配置3、知识点了解&#xff08;1&#xff09;jetson 系列硬件了解&#xff08;2&#xff09;以下大致罗列jetson系列1. Jetson Nano2. Jetson TX23. Jetson Xavier NX4. Jetson…

镜像部署和服务器步署的介绍和不同点

镜像部署通常指的是使用Docker容器进行部署&#xff0c;而服务器部署则是指直接在服务器的操作系统上安装依赖并运行项目。下面是两种部署方式的介绍和它们的主要不同点&#xff1a; 镜像部署&#xff08;Docker&#xff09;&#xff1a; 环境隔离&#xff1a;Docker通过容器…

基于Amazon Bedrock打造Claude3 Opus智能助理

近期&#xff0c;Anthropic 发布了其最新的大模型 Claude3。截止本文撰写时&#xff0c;Claude3 Opus、Claude3 Sonnet、Claude3 Haiku 均已在 Amazon Bedrock 可用&#xff0c;随着 Amazon Bedrock 可提供越来越多的大模型&#xff0c;您可以在您的应用场景里将其落地&#xf…

C语言:指针详解(3)

目录 一、字符指针 二、数组指针 1.数组指针的定义 2.数组指针的初始化 3. 二维数组传参的本质 三、函数指针 1.函数指针的创建 2.函数指针的使用 3.有趣的代码(1) 4.有趣的代码(2) 四、typedef关键字 1.typedef的使用方法 2.typedef和#define的区别 五、函数指针…

湖南建研信息工程质量检测系统 文件上传致RCE

漏洞描述 湖南建研信息工程质量检测系统 文件上传致RCE&#xff0c;攻击者可通过此漏洞上传恶意脚本文件&#xff0c;对服务器的正常运行造成安全威胁&#xff01; 漏洞复现 1、语法 fofa&#xff1a;https://fofa.info/ body"/Content/Theme/Standard/webSite/login.c…

PDF 正确指定页码后,挂载的书签页码对不上

这个问题与我的另一篇中方法一样 如何让一个大几千页的打开巨慢的 PDF 秒开-CSDN博客 https://blog.csdn.net/u013669912/article/details/138166922 另作一篇的原因 一篇文章附带一个与该文章主题不相关的问题时&#xff0c;不利于被遇到该问题的人快速搜索发现以解决其遇到…

理解Linux文件系统

文章目录 一、引言二、Linux文件系统概述1、文件系统的结构2、文件系统目录树的逻辑结构 二、文件系统的特性1、super block&#xff1a;文件系统的超级块2、inode&#xff1a;文件系统的索引节点3、inode table4、block&#xff1a;文件系统的数据块5、块组描述符表&#xff0…

Linux系统中搭建Mosquitto MQTT服务并实现远程访问本地消息代理进行通信

文章目录 1. Linux 搭建 Mosquitto2. Linux 安装Cpolar3. 创建MQTT服务公网连接地址4. 客户端远程连接MQTT服务5. 代码调用MQTT服务6. 固定连接TCP公网地址7. 固定地址连接测试 今天和大家分享一下如何在Linux系统中搭建Mosquitto MQTT协议消息服务端,并结合Cpolar内网穿透工具…

移植 SquareLine 导出的 UI 源码到 HMI-Board

目录 准备工具创建 HMI 工程设计 UIUI 移植板级验证更多内容 HMI-Board 为 RT-Thread 联合瑞萨推出的高性价比图形评估套件&#xff0c;取代传统的 HMI 主控板 硬件&#xff0c;一套硬件即可实现 HMI IoT 控制 的全套能力。依托于瑞萨高性能芯片 RA6M3 及 RT-Thread 软件生态…

vue this.$message使用点击事件,el Message 消息提示加按钮,在this.$message加按钮

背景:在开发过程中需要再this.$message加点击事件,但是官方并没有提供相应的事件,所以需要自定义一套 展示效果 完整代码 this.$message弹窗部分代码如下,这里点击 <template><!-- 定义了一个按钮,点击时会触发getMessage方法 --><button type="pri…

vue3实现移动端,PC端响应式布局

纯移动端|PC端 这种适用于只适用一个端的情况 方法&#xff1a;amfe-flexible postcss-pxtorem相结合 ① 执行以下两个命令 npm i -S amfe-flexible npm install postcss-pxtorem --save-dev② main.js文件引用 import amfe-flexible③ 根目录新建一个postcss.config.js文件…

【二叉树——数据结构】

文章目录 1.二叉树1.基本概念.几种特殊的二叉树 2.考点3.二叉树的存储结构4.二叉树的遍历5.线索二叉树 1.二叉树 1.基本概念. 二叉树是n(n>0)个结点的有限集合 或者为空二叉树&#xff0c;即n0 或者由一个根结点和两个互不相交的被称作根的左子树和右子树组成。 每个结点至…

口袋实验室--使用AD2高效调试IIC、UART、SPI等低速接口

目录 1. 简介 2. 调试过程 2.1 简要步骤 2.2 Si5338 寄存器配置流程 2.3 AD2的基本配置 2.4 检查Si5338状态 2.5 配置Si5338寄存器 2.6 保存Si5338寄存器 3. 总结 1. 简介 使用Digilent Analog Discovery 2进行调试不仅提升了工作效率&#xff0c;而且极大地简化了常…

Redis---------实现短信登录业务

目录 基于Session的短信登录 ①首先看他的业务逻辑 ②进行代码逻辑处理 基于Redis的短信登录 ①首先看他的业务逻辑 ②进行代码逻辑处理 Controller&#xff1a; Service接口&#xff1a; Service实例&#xff1a; Mapper&#xff1a; 封装ThreadLocal线程的数据操作&#x…

如何快速搭建nginx虚拟主机

华子目录 实验1&#xff1a;基于IP地址的虚拟主机原理 实验2&#xff1a;基于端口号的虚拟主机原理 实验3&#xff1a;基于域名的虚拟主机原理 实验1&#xff1a;基于IP地址的虚拟主机 原理 如果一台服务器有多个IP地址&#xff0c;而且每个IP地址与服务器上部署的每个网站一一…

latex+vscode一直报错,配置文件json和环境变脸配置

1、json配置文件 {"latex-workshop.latex.tools": [{"name": "xelatex","command": "xelatex","args": ["-synctex1","-interactionnonstopmode","-file-line-error","%DOCF…