串口发送float类型数据

2023-05-16

STM32串口发送float类型数据

一、代码

1、发送

void send_gyro(float yaw,float pitch,float roll)
{
	float aaa,bbb,ccc;
	u8 buff[14] = {0};
	char buff_yaw[4],buff_pitch[4],buff_roll[4];
	u8 *p;//中间指针
	buff[0] = 0x10;//帧头
	p = (u8 *)&yaw;//中间指针赋值
	for(int i=1;i<5;i++)
	{
		buff[i] = (u8)(*(p+i-1));
		buff_yaw[i-1] = buff[i];
	}
	p = (u8 *)&pitch;//中间指针赋值
	for(int i=1;i<5;i++)
	{
		buff[i+4] = (u8)(*(p+i-1));
	}
	p = (u8 *)&roll;//中间指针赋值
	for(int i=1;i<5;i++)
	{
		buff[i+8] = (u8)(*(p+i-1));
	}
	for(int i=0;i<13;i++)
	{
		buff[13] += buff[i];
	
	}
	for (int i=0;i<14 ;i++)
	{   
		USART_SendData(USART1, buff[i]);
//		while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);	//判断缓存区是否清零
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) ==RESET);  // 判断是否发送完成
	}
}

2、接收

float Yaw,Pitch,Roll;
void USART2_IRQHandler (void)
{
	char res=0;
	char buff_yaw[4] = {0},buff_pitch[4] = {0},buff_roll[4] = {0};
	static char fly[15] = {0},fl = 0;
//	USART_OUT(USART1,"222");
	if (USART_GetITStatus(USART2, USART_IT_RXNE) !=RESET)										
	{
		res = USART2->DR;
		fly[fl] = res;
		if(fly[0] == 0x10)
		{
			fl++;
			if(fl > 13)
			{
				for(int i=0;i<13;i++)
				{
					fly[14] += fly[i];
				}
				if(fly[13] == fly[14])
				{
					fly[13] = 0;fly[14] = 0;
//					USART_OUT(USART1,"44");
					fl = 0;
					buff_yaw[0] = fly[1];
					buff_yaw[1] = fly[2];
					buff_yaw[2] = fly[3];
					buff_yaw[3] = fly[4];
					Yaw = *(float*)buff_yaw;
					
					buff_pitch[0] = fly[5];
					buff_pitch[1] = fly[6];
					buff_pitch[2] = fly[7];
					buff_pitch[3] = fly[8];
					Pitch = *(float*)buff_pitch;
					
					buff_roll[0] = fly[9];
					buff_roll[1] = fly[10];
					buff_roll[2] = fly[11];
					buff_roll[3] = fly[12];
					Roll = *(float*)buff_roll;
					
					printf("Yaw=%f      Pitch=%f       Roll=%f\r\n",
					Yaw,Pitch,Roll);
					
				}else{
					for(int i = 0;i<13;i++)
					{
						fly[i] = 0;
					}
					
					fl = 0;
				}
			}
			
		}else{
			for(int i = 0;i<13;i++)
			{
				fly[i] = 0;
			}
			
			fl = 0;
		}
		USART_ClearFlag(USART2, USART_FLAG_RXNE);                              //清楚标志位
	}
}

二、总体思路

​ 发送采用指针形式进行发送,将float解析成四个字节,分别使用数组进行存放,由于串口只能一位一位的进行发送,所以使用串口将float构成的数组一位一位的进行发送后,在接收端同样使用相同的数组结构进行接收,然后使用强制转化,得到float类型数据。关于float类型的大端小端等等详解,网上有资料,我这就不解释了。

三、发送重点和踩坑

​ 1、发送时必须使用校验位,帧头,不使用的话数据是散装的,发过去组成的float类型可能正确,大概率错误。

​ 2、得到的float类型存储在数组中时注意指针偏移,是从0位~3位的,要是错误会造成地址数据覆盖,导致数据在接收端整合发生错乱。

​ 3、发送端在有线传输的情况下理论上不需要加延时

​ 4、发送结束加上判断位,加第二条,判断是否发送完成。加第一条判断缓存区是否清零有风险,在数据还未发送完成时缓存区清零,导致下一条数据发送,造成丢包现象。

while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); //判断缓存区是否清零
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) ==RESET); // 判断是否发送完成

​ 5、可以增加结束帧,使用发送端数据相加,得到动态结束帧,在接收端进行接收数据相加,从而判断数据是否正确。切记数据初始化。

四、接收重点和踩坑

​ 1、同样,接收照着发送的方式进行编写,将每一组数据分好,从而强转得到float数据

​ 2、记得标志fl清零,防止内存泄漏,从而造成程序崩塌。

对大家有帮助的话,点赞收藏哦!!!

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

串口发送float类型数据 的相关文章

  • 常用的get、post请求有哪些

    常见的get post请求有哪些呢 常见的get请求有 form标签中method 61 get 发起的是get请求 a标签发起的是get请求 link标签引入css发起的是get请求 Script标签引入js文件发起的是get请求 img
  • 串口通信整理:二、数据发送之多位数据发送

    本文基于前一篇串口模块基础版进一步对串口发送数据整理 xff0c 并通过仿真进行验证 xff0c 所有代码都可直接跑通 xff0c 注意各个模块名字 首先再次回顾一下通信协议UART 本质就是并行数据转串行数据 关键参数 xff1a 起始位
  • HTTP协议解析

    文章目录 一 HTTP协议基础1 定义2 工作原理3 特点4 与Https的区别 x1f435 HTTPS简介 xff1a 两者区别 xff1a 二 HTTP请求协议1 HTTP请求结构 xff1a 2 请求方法3 举例4 Post和Get
  • Java httpUtil工具类

    需要导入的依赖 xff1a span class token generics span class token punctuation lt span dependency span class token punctuation gt
  • 博士申请 | 浙江大学孙优贤院士课题组招收智能无人系统方向硕士生/博士生

    合适的工作难找 xff1f 最新的招聘信息也不知道 xff1f AI 求职为大家精选人工智能领域最新鲜的招聘信息 xff0c 助你先人一步投递 xff0c 快人一步入职 xff01 浙江大学 网络传感与控制研究组 xff08 Group o
  • 文件解析__JSON解析

    一 JSON解析 1 简介 xff1a JSON是一种轻量级的数据交换格式 2 Java解析JSON 序列化 xff1a 将Java对象转换成JSON格式的数据 反序列化 xff1a 将JSON格式的数据转换成Java对象 import c
  • XSSFWorkbook,SXSSFWorkbook以及EasyExcel读取Excel文件的比较

    同时读取30w数据 xff0c 比较运行时间及CPU 内存占比 1 EasyExcel package com apesource import java util ArrayList import java util List impor
  • 基于FTP协议的文件上传与下载

    一 什么是FTP FTP 是File Transfer Protocol xff08 文件传输协议 xff09 的英文简称 xff0c 而中文简称为 文传协议 用于Internet上的控制文件的双向传输 同时 xff0c 它也是一个应用程序
  • MyBatis

    目录 优点 缺点 重难点问题 xff1a 1 传递多个参数 2 与 的区别 3 resultMap 元素 4 批处理 MyBatis 是一个开源 轻量级的数据持久化框架 xff0c 是 JDBC 和 Hibernate 的替代方案 MyBa
  • TCP协议的拥塞控制

    一 什么是拥塞控制 发送方需要维护一个状态变量 拥塞窗口cwnd 来决定发送方同时可以发送多少数据包 二 控制算法 1 慢开始 当主机开始传送数据时 xff0c 如果把大量数据注入 xff0c 可能会造成网络堵塞 所有 xff0c 为了避免
  • Autowired实现原理

    一 认识 64 Autowired 64 Autowired 替换 xff1a autowire属性 自动装配 xff08 按照类型装配 xff0c 通过set方法 xff0c 且方法可以省略 xff09 位置 xff1a 修饰属性 xff
  • JavaScript常用事件

    目录 鼠标 键盘事件 1 onclick 事件 2 onmouseover 事件 3 onmouseout 事件 4 onkeyup 事件 表单事件 1 onchange 事件 2 onfocus 事件 3 onblur 事件 鼠标 键盘事
  • 2020年电赛总结

    前言 前几天电赛的成绩公布了 xff0c 跟师哥们混了个省三等奖 xff0c 不管怎么说 xff0c 还是想写点东西 xff0c 来纪念一下这一年来的经历 正文 参加电赛可以说本来没有在我预料的范围之内 xff0c 基本上准备电赛所学习的知
  • 「C/C++」一些值得学习的C++开源库

    目录 说明BoostPocoOpenCVEigenSQLiteQtTensorFlow 说明 学习这些 C 43 43 开源库不仅可以提高我们的编程水平 xff0c 同时也可以提高我们的编程效率 xff0c 加速我们的应用程序开发 当然 x
  • Python中的__file__

    在Python项目开发过程中 xff0c 有的时候会获取程序文件的相对路径或者绝对路径 因此经常会见到如下的语句 xff1a import os os path dirname file 因此本文件这里的 file 是指明什么呢 xff1f
  • 记一下 Windows11 安装与配置 node.js 的标准步骤

    1 首先随便下载个 node js 的x86或x64 msi安装包 xff0c 双击直接安装 xff0c 安装的路径如 34 C Program Files nodejs 34 xff1b 2 安装完成后 xff0c 打开 cmd 命令控制
  • 什么是结构体内存对齐,有什么好处

    什么是结构体内存对齐 xff0c 有什么好处 下面先看一个例子 xff1a span class token macro property span class token directive keyword include span sp
  • 2.4G通信

    文章目录 2 4G无线通信实验一 模块简介二 Enhanced ShockBurstTM模式介绍三 编程1 初始化IO口2 Enhanced ShockBurstTM发送流程3 Enhanced ShockBurstTM发送模式初始化4 E
  • PTA非零返回的解决办法java

    应该不止我一个是在PTA做题遇到了 非零返回 导致不能AC xff0c 结果网上搜了一大堆相关资料按照步骤说的来改后依然没什么用的倒霉蛋吧 这是一件很无助的事情 xff0c 而且改代码真的很烦 造成非零返回的原因很多 xff0c 但是多数情
  • keil5的代码全是黑色不显示其他颜色/Colors&Fronts没有C/C++ Editor files选项(用于设置代码颜色)——安装路径不要有中文

    学习51单片机要用到keil5生成hex然后烧写文件 xff0c 但是在使用keil5的过程中遇到了一些小麻烦 C文件打开后代码全是黑色 xff0c 关键字等不显示高亮和其他不同颜色 xff0c 如下图所示 xff1a 是一个流水灯的小白程

随机推荐