STM32F103C8T6 gps串口数据处理

2023-05-16

 基于stm32f10x系列单片机demo程序修改

配置串口

void USART1_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	/* 使能串口时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); 

	/* USART1的IO脚配置*/    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);    
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;	//¸¡¿ÕÊäÈë
  GPIO_Init(GPIOA, &GPIO_InitStructure);   //³õʼ»¯GPIOA
	
	/* USART1 工作模式配置*/
	USART_InitStructure.USART_BaudRate = 115200;	//波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//数据位
	USART_InitStructure.USART_StopBits = USART_StopBits_1; 	//停止位
	USART_InitStructure.USART_Parity = USART_Parity_No ;  //奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制模式设置,没有使能
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接受发送使能,这个可以根据实际设置
	
	USART_Init(USART1, &USART_InitStructure);  //初始化
	USART_Cmd(USART1, ENABLE);// USART1使能
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);    // 使能串口中断
	
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;  //中断配置
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
}

NVIC_InitTypeDef 函数接口需要的头文件 #include "misc.h"

串口数据发送(发送到串口助手的数据,我们一般在单片机接收到串口数据后不知道数据是否正确,需要将接收到的数据显示出来可以用这个函数来实现)

void UART1SendByte(USART_TypeDef* USARTx,unsigned char SendData)
{	   
		USART_SendData(USARTx,SendData);
		while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);	    
}

串口中断方式进行数据的接收

void USART1_IRQHandler(void) 
{		
	uint8_t rec = 0;
    char str[15];
	char str1[15];
	char str2[5];

	uint16_t  x=0;
	uint16_t  x1 = 0;
		
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{
		USART_ClearITPendingBit(USART1,USART_IT_RXNE); 
		rec = USART_ReceiveData(USART1);
        //头判断
		if(rec == '$')
		{
			gps_count =0;
			count = 1;
			for(i=0;i<RECEIVE_BUF_LEN;i++)
			{
				ReceiveBuff[i] = 0;
				sendBuff[i] = 0;
			}
			ReceiveBuff[0] = rec;
			gps_state = f_start;
		}
		else if(gps_state == f_start)
		{
			//判断接收的数据个数
			if(rec == ',')
			{
				sendBuff[gps_count++] = count;
						
			}
			if(rec == '*' && gps_count > 15)
			{
				gps_state = f_end;

			}
			ReceiveBuff[count++] = rec;
		}
		else if(gps_state == f_end)
		{
			gps_state = f_finished;
			//UART1SendByte(2);
			for(i=0; i< count; i++)
			{
				UART1SendByte(USART1, ReceiveBuff[i]);
			}
			// ½âÎö
			for( i =sendBuff[8]+1; i < sendBuff[9]; i++)
			{
				str[x++] = ReceiveBuff[i];
			}
			for( i =sendBuff[9]+1; i < sendBuff[10]; i++)
			{
				str1[x1++] = ReceiveBuff[i];
			}

					
			if(second_get == 1)
			{
				x_latitude = atof(str)*10;
				y_longtitude = atof(str1)*10;
				second_get = 2;
			}
			else if(second_get == 2)
			{
				 x1_latitude = atof(str)*10;
				 y1_longtitude = atof(str1)*10;
				three_get = 1;
			}
					
			if(three_get == 1)
			{
				float result1 = x_latitude - x1_latitude;
				float result2 = y_longtitude -  y1_longtitude;
				if((abs(result1) > 5.0)||(abs(result2) > 5.0))
				{
					LED1( ON );
				}
				else if((abs(result1) < 5.0)&&(abs(result2) < 5.0))
				{
					//UART1SendByte(USART1, 2);
					LED1( OFF );
				}
				x_latitude = x1_latitude;
				y_longtitude =  y1_longtitude;
				second_get = 2;
			}
		 }				
	}

	if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET)
	{   

		USART_ClearFlag(USART1,USART_FLAG_TC); 
		USART_ReceiveData(USART1); 
	}  
}

中断函数中主要实现逻辑,接收串口发送的字节rec,对rec进行判断是否为符合要求的数据头,如果符合,将接收串口数据保存到ReceiveBuff中,这里没有对校验位进行判断,通过对‘"," 和结束符来判定数据是否接收完成,接收完成后在if(gps_state == f_end)中对最终的数据进行解析,

for(i=0; i< count; i++)
{
	UART1SendByte(USART1, ReceiveBuff[i]);
}

将接收的完整数据打印出来

for( i =sendBuff[8]+1; i < sendBuff[9]; i++)
{
	str[x++] = ReceiveBuff[i];
}

sendBuff中存储的是数据中的每一个", "的位置,通过这个我们能找到需要的字符串数据保存到str数组中

if(second_get == 1)
{
	x_latitude = atof(str)*10;
	y_longtitude = atof(str1)*10;  //字符转float
	second_get = 2;
}
else if(second_get == 2)
{
	x1_latitude = atof(str)*10;
	y1_longtitude = atof(str1)*10;
	three_get = 1;
}

if(three_get == 1)
{
	float result1 = x_latitude - x1_latitude;
	float result2 = y_longtitude -  y1_longtitude;
	if((abs(result1) > 5.0)||(abs(result2) > 5.0))
	{
		LED1( ON );
	}
	else if((abs(result1) < 5.0)&&(abs(result2) < 5.0))
	{
			//UART1SendByte(USART1, 2);
		LED1( OFF );
	}
	x_latitude = x1_latitude;
	y_longtitude =  y1_longtitude;
	second_get = 2;
}

这个里面的作用是取接收到的相邻的两组数据进行比较判断来确定我们当前是否需要进行其他的操作

atof函数使用的头文件#include <stdlib.h>

sqrt函数使用的头文件 #include <math.h>

附 :使用的GPS模块的通信协议

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103C8T6 gps串口数据处理 的相关文章

  • 在 Swift 中将 GPS 坐标转换为城市名称/地址

    我有一个纬度 经度位置 我想将其转换为 Swift 中的位置名称字符串 做这个的最好方式是什么 我相信最好使用reverseGeocodeLocation函数 但不完全确定如何使用 这是我到目前为止所拥有的 func locationMan
  • 我无法在 Android 真实手机上获取位置

    public class LocationService extends Service private Handler mHandler new Handler private Timer mTimer null private int
  • GPS 转换 - 像素坐标到 GPS 坐标

    我正在根据视频数据进行一些运动跟踪 使用一些视频处理 即转换为自上而下的视图 我获得了移动路径 我现在需要将路径的像素坐标 x y 转换为世界坐标 纬度 经度 我在图像中有四个参考点及其相关的纬度和经度点 纬度 经度 gt 像素坐标 51
  • Android 手机和模拟器中的mapView不同

    关于应用程序 这是一个简单的应用程序 可以查找用户当前位置 问题 该应用程序在模拟器上运行良好 请参见图片 但在手机中它没有显示MapView 请看图片 请告诉我手机出了什么问题 在手机中 它只下载巨大的 20 MB 数据 但不显示实际地图
  • Android LocationManager.getLastKnownLocation() 返回 null

    因此 我尝试在应用程序中对 GPS 坐标进行一次采样 我不想创建 LocationListener 对象来不断获取 GPS 更新 我想等到收到坐标 然后继续执行另一项任务 这是一个代码片段 LocationManager lm Locati
  • Android 将阿拉伯数字转换为英文数字

    我从 GPS 收到以下错误 Fatal Exception java lang NumberFormatException Invalid double 现在 这是我通过 Fabric 从用户处收到的错误 它看起来像阿拉伯语 所以我猜只有当
  • 动态更改 GPS LocationListener 的 minTime

    我正在编写的应用程序使用 GPS 位置管理器服务 requestLocationUpdates 但我希望能够更改整个程序中的最小时间和最小距离参数 我在创建时初始化位置侦听器 但我不知道如何更改这些参数 甚至不知道是否可以这样做 这样做的主
  • 在带有校准点的地图上将经度和纬度转换为 X Y

    如果我有一张尺寸为 sizeX sizeY 的 jpeg 地图 以及地图上的一些校准点 X Y 经度 纬度 使用给定的经度 纬度对计算地图中相应 XY 点的算法是什么 这对我有用 没有那么多废话 int x int MAP WIDTH 36
  • 设置模拟位置时 GPS 提供商未知错误?

    我正在尝试设置我的模拟位置 但是 我收到以下错误 提供商 gps 未知 并且不确定出了什么问题 我已经获得了在manifest xml 中声明的所有权限以及所有参数 模拟定位法 Initiates the method to set the
  • React Native Android 位置请求超时

    在 IOS 中查找 GPS 坐标时没有问题 效果很好 Android 端不如 IOS 稳定 在真机和模拟器中都会出现这个问题 有时它可以找到位置 但有时却找不到 寻找了3天 但没有找到解决方案 当我的应用程序无法找到我的位置时 我尝试通过谷
  • Android GPS 的准确度如何? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我好像在某处读过Android的GPS精度约为10厘米 任何人都可以验证或更正这个吗 原因是我正在尝试开发的应用程序会跟踪用户访问过的位置 这将极大地
  • GPS 对比加速度计计算距离

    我正在尝试实现一个健身应用程序 可以在Android 中跟踪跑步速度和跑步距离 看起来我可以使用 GPS 或加速度计来计算这些信息 由于跑步者可能会将手机放在手里 放在肩膀上或放在口袋里 所以我的第一直觉是使用 GPS 获取位置并计算跑步速
  • GPS 坐标(以度为单位)来计算距离

    在iPhone上 我以十进制度数获取用户的位置 例如 纬度39 470920和经度 0 373192 也就是A点 我需要用另一个 GPS 坐标 同样以十进制表示 B 点创建一条线 然后 计算从 A 到 B 的线与另一个点 C 之间的距离 垂
  • Android:计算两个位置之间距离的最佳方法

    我在这个主题上做了一些研究 但有很多观点并没有给出一个清晰的图像 我的问题是这样的 我正在为 Android 开发一个基于 GPS 的应用程序 在其中我想实时了解 Android LocationManager 指定的当前位置与其他位置之间
  • Android 查找 GPS 位置一次,显示加载对话框

    我正在编写一个应用程序 它需要用户的当前位置 lastknownlocation 不会很有帮助 并显示从数据库中获取的所有最接近的 项目 的列表 我已经找到了最近的项目 效果很好 但暂时只使用硬编码的纬度和经度位置 但现在是时候实现查找实际
  • Android 中的 GPS 超时

    在黑莓中 我们使用超时来获取位置 这样如果它在这么长时间内没有重新调整位置 我们就会知道 但是在Android中 没有超时的概念 任何人都可以告诉我们替代方案 我们可以发现 在这么长时间之后 GPS没有位置更新 您可以使用两个线程来实现此超
  • 当我的活动结束时,如何停止 GPS/位置跟踪?

    我有一个非常简单的 Android 应用程序 它显示 Google 地图视图并使用 GPS 跟踪位置 基本上像这样 public void onCreate Bundle savedInstanceState mLocationManage
  • requestLocationUpdates minTime 参数用途

    我正在创建一个应用程序 用于教育目的 它每 30 分钟记录一次用户的位置 并使用户能够查看地图上的所有位置 我不希望更新频率超过 30 分钟 但事实确实如此 这就是我的称呼requestLocationUpdates locationMan
  • 如何创建在 React-Native 中检测自动位置的地图

    我已经在react native中创建了地图 参考https github com lelandrichardson react native maps https github com lelandrichardson react nat
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl

随机推荐

  • 什么是栈,栈及其特点和应用详解

    同顺序表和链表一样 栈也是用来存储逻辑关系为 一对一 数据的线性存储结构 如图 nbsp 1 所示 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp
  • 四款经典3.7v锂电池充电电路图详解 - 全文锂电池的内部结构所致,必须保留一部分锂离子在负极,锂电池不能过放电

    3 7v锂电池充电电路图 xff08 一 xff09 1 锂电池的充电 xff1a 根据锂电池的结构特性 xff0c 最高充电终止电压应为4 2V xff0c 不能过充 xff0c 否则会因正极的锂离子拿走太多 xff0c 而使电池报废 其
  • USART_ClearITPendingBith和 USART_ClearFlag的区别

    一个是清除标志 xff0c 判断中断是否处理完 一个是清除中断标志位 xff0c 根据标志位来执行相应的中断函数 一个是在入口 xff08 是否触发某个中断 xff09 xff0c 一个是在出口 xff08 是否完成某个中断 xff09 起
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数(作者自己生成的函数代码,中间有关闭接收中断,但是原子教程中没有关闭中断的语句注意区别)

    前言 1 UART Receive IT 2 HAL UART Receive 3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • STM32 HAL库串口发送函数HAL_UART_Transmit()分析

    STM32 HAL库串口发送函数HAL UART Transmit 分析 硬件平台 xff1a STM32F103VET6 软件平台 xff1a STM32CubeMX 4 22 MDK 5 23 HAL库版本 xff1a FW F1 V1
  • 我在STM32单片机上跑神经网络算法

    01 前言 为什么可以在STM32上面跑神经网络 xff1f 简而言之就是使用STM32CubeMX中的X Cube AI扩展包将当前比较热门的AI框架进行C代码的转化 xff0c 以支持在嵌入式设备上使用 目前使用X Cube AI需要在
  • slambook2+ch7+orb_self 源码的一点小问题

    slambook2 43 ch7 43 orb self 源码的一点小问题 43 解读 源码详细解读小错误调试 xff0c 有的真的属实自己菜运行结果 源码详细解读 下面是一些个人的见解内联代码片 span class token comm
  • 运行相机与vins_Fusion

    安装相机的SDK git clone https github com slightech MYNT EYE D SDK git cd MYNT EYE D SDK make init make all 这里由于没有添加依赖 xff0c O
  • 无刷无霍尔BLCD电机控制

    声明 xff1a 本文出自百度文库无刷无霍尔电机控制 xff0c 因为该文为繁体 xff0c 看起来特别别扭 xff0c 特此翻译 文库网址 xff1a https wenku baidu com view b99217dca0116c17
  • stl的中常用几个容器的介绍与特点。

    lt 1 gt vector容器 vector容器是一个动态数组的结构 xff0c 在内存中有一个指针指向一块连续的内存 类似数组结构一样 它的特点支持随机访问数据 xff0c 因为其在内存中的单元是连续 如此之外 xff0c 还可以vec
  • 关闭优化选项

    这里没有调用拷贝构造函数 xff0c 按照C 43 43 机制 xff0c 应该是会调用的 想起来 xff0c 以前最初写拷贝构造函数的时候也是跟预想的调用不一致 记得编译器会自动优化掉临时对象的 比如 在一个函数中 return list
  • WIFI学习一(socket介绍)

    一 什么是socket socket译为 插座 xff0c 在计算机通信领域 xff0c socket被翻译为 套接字 xff0c 它是计算机之间进行通信的一种约定或一种方式 通过这种方式 xff0c 一台计算机可以接受其他计算机的数据 x
  • 两台电脑实现串口通信

    本文主要介绍串口传输文件的练习 将两台笔记本电脑 xff0c 借助 usb转rs232 模块和杜邦线 xff0c 建立起串口连接 然后用串口助手等工具软件 xff08 带文件传输功能 xff09 将一台笔记本上的一个大文件 xff08 图片
  • VScode前进和后退按钮,非快捷键

    在网上找了半天 xff0c 不喜欢用快捷键 xff0c 喜欢鼠标点击 xff0c 费了好长时间发现这个插件 Back amp Forth xff0c 安装后可以在右上角出现前进和后退按钮 xff0c 如下图
  • Nonce验证

    验证可能会涉及 span class token keyword def span span class token function getNonce span span class token punctuation span span
  • DJI飞行器 精准降落功能测试

    概述 xff1a 该功能仅在自动返航至起飞点 Auto RTL 时生效 xff0c 飞行器降落环境需要足够的照明和没有障碍物的区域 使用该功能后 xff0c 飞行器将使用底部的两个视觉传感器记录起飞时的地形纹理信息 xff0c 并根据记录的
  • 带学生参加电赛,5个国一,2个国二!15个省奖!

    大家好 xff0c 我是张巧龙 xff0c 转眼21年的各省电赛就结束了 xff0c 今年的电赛确实让人难忘 xff0c 不管是题目还是比赛形式 xff0c 亦或是比赛时间一拖再拖 国赛结果也在前段时间公示了 xff0c 参与人数再次增长
  • 【JAVA基础篇】内部类

    定义在一个类内部的类称为内部类 内部类访问权限可以是public protected default或private xff0c 可以声明为abstract供其他内部类或外部类继承 xff0c 可以声明为static final xff0c
  • CURL 是什么

    cURL是一个利用URL语法在命令行下工作的文件传输工具 xff0c 1997年首次发行 它支持文件上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习惯称cURL为下载工具 cURL还包含了用于程序开发的lib
  • STM32F103C8T6 gps串口数据处理

    基于stm32f10x系列单片机demo程序修改 配置串口 void USART1 Config void GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitSt