STM32 HAL库串口收发数据

2023-05-16

STM32 HAL库串口收发数据

许多传感器的使用方法是:单片机给传感器发送一帧数据,然后传感器返回单片机一帧有用数据,所以串口的收发功能十分重要。

STM32cubeMX的配置

时钟和下载方式就不讲了
串口配置,因为要接收数据,所以通常打开串口中断
在这里插入图片描述
注意要选到模块需要的波特率,数据位,校验位,停止位,很多模块的波特率是9600,不是我们常用的115200不一样。
打开中断:
在这里插入图片描述
串口配置就这些

串口发送

发送函数:

HAL_UART_Transmit_IT(&huart1, (uint8_t *)CO2AskBuffer, sizeof(CO2AskBuffer));

其中第一个参数是串口号,第二个参数是要发送的数据起始地址,第三个是要发送的数据长度,一般都用sizeof函数专业一点。
把要发送的数据放在一个数组里:

uint8_t  CO2AskBuffer[9]={0xFF,0x01,0x03,0x02,0x00,0x00,0x00,0x00,0xFB};

串口接收

首先需要打开中断,通常是在单片机发送完指令后开中断:

uint8_t  RecieveBuffer[1]={0};//暂存接收到的字符
HAL_UART_Receive_IT(&huart1, (uint8_t *)RecieveBuffer, 1);

不定长接收:

uint8_t  CO2Buffer[12];//收到的数据存放处
uint8_t  RxLine=0; //记录接收数据长度
uint8_t errorBuffer[]="\r\nerror\r\n"; //错误提示
/**
 * @brief 不定长数据接收
 * @param  串口号
 * @retval void
 * @author smart_mode
 * @Time 2021年11月21日
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	UNUSED(huart);
	RxLine++;
	CO2Buffer[RxLine-1]=RecieveBuffer[0];
	if (RxLine>12) //根据自己的需要修改,当数据接收超多多少位就错了
	{
		RxLine=0;
		memset(CO2Buffer,0,sizeof(CO2Buffer)); 
		HAL_UART_Transmit_IT(&huart1, (uint8_t *)errorBuffer,sizeof(errorBuffer));
	}
	if (RecieveBuffer[0]==0x0A)  //数据最后一字节,根据实际情况修改
	{
		HAL_UART_Transmit_IT(&huart1, (uint8_t *)CO2Buffer,RxLine);  //如果接收到的数据都对,就将数据发送出去
		RxLine=0;	
	}

	RecieveBuffer[0]=0;
	HAL_UART_Receive_IT(&huart1, (uint8_t *)RecieveBuffer, 1);
	//一定记得再次打开中断
}

数据帧的检验和处理

我们可能需要判断传感器发送来的数据是否是正确的,也可能需要对数据帧的某几个字节做处理,这种情况可以用状态机的写法:

uint8_t  NH3Buffer[10]; //存放模块返回的数据 16进制
uint8_t  RxLine=0; //接收到的数据长度
uint8_t  RecieveBuffer[1]={0};//临时存放数据
uint8_t  gaozijie;  //有用数据高字节
uint8_t  dizijie;   //有用数低字节
uint16_t  NH3concentration;
double  NH3Dec;   //十进制的NH3浓度
uint8_t errorBuffer[]="\r\nerror\r\n";
extern uint8_t flag;
/**
 * @brief 接收回调:保存数据并处理
 * @param  串口号
 * @retval void
 * @author smart_mode
 * @Time 2021年11月21日
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	UNUSED(huart);
	RxLine++;  //接收到的数据加一
	NH3Buffer[RxLine-1]=RecieveBuffer[0];  //保存收到的正确数据
//判断帧头是否正确,只要某一位错了,就重新等待正确的第一位数据
	if (RxLine==1)
	{
		if(RecieveBuffer[0]==0xFF)
		{
			RxLine=1;
		}
		else
		{
			RxLine=0;
		}	
	}
	else if(RxLine==2)
	{
		if(RecieveBuffer[0]==0x01)
		{
			RxLine=2;
		}
		else
		{
			RxLine=0;
		}	
	}
	else if(RxLine==3)
	{
		if(RecieveBuffer[0]==0x07)
		{
			RxLine=3;
		}
		else
		{
			RxLine=0;
		}	
	}
	else if(RxLine==4)
	{
		if(RecieveBuffer[0]==0x02)  //分辨率0.01
		{
			RxLine=4;
		}
		else
		{
			RxLine=0;
		}	
	}
	else if(RxLine==5)
	{
		gaozijie=RecieveBuffer[0];  //保存有用数据高字节
	}
	else if(RxLine==6)
	{
		dizijie=RecieveBuffer[0];   //保存有用数据低字节
		//16进制转换10进制,并缩小100倍
		NH3Dec=gaozijie*256+dizijie*1;
		NH3Dec=NH3Dec*0.01;     
	}
	else if(RxLine==7)
	{
		if(RecieveBuffer[0]==0x00) 
		{
			RxLine=7;
		}
		else
		{
			RxLine=0;
		}	
	}
	else if(RxLine==8)
	{
		if(RecieveBuffer[0]==0x00)  
		{
			RxLine=8;
		}
		else
		{
			RxLine=0;
		}	
	}
	else if(RxLine==9)
	{
		if(RecieveBuffer[0]==0x00)  
		{
			RxLine=9;
		}
		else
		{
			RxLine=0;
		}	
	}
	else if(RxLine==10&flag==0)
	{
		printf("%.2f ppm",NH3Dec);  
		flag=1;
		RxLine=0;	
	}
	else 
	{
		flag=1;
		RxLine=0;	
	}
	
	RecieveBuffer[0]=0;
	HAL_UART_Receive_IT(&huart1, (uint8_t *)RecieveBuffer, 1);
}



CO2和NH3和HCHO(二氧化碳和氨气和甲醛)的检测代码已上传我的资源,需要可自行下载
PS 二氧化碳是环境中有的气体,比较容易检测。空气中的氨气几乎没有,得去卫生间这种地方收集,可以用排水集气法。甲醛可以去新装修的房子里收集,如果没有这个条件可以使用酒精棉,一些酒精棉里面有甲醛。

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

STM32 HAL库串口收发数据 的相关文章

  • c++ string find(), rfind(), find_first_of(),find_last_of()

    find rfind 函数原型 xff1a span class token keyword int span span class token function find span span class token punctuation
  • 1233. 删除子文件夹

    难度 xff1a 中等 你是一位系统管理员 xff0c 手里有一份文件夹列表 folder xff0c 你的任务是要删除该列表中的所有 子文件夹 xff0c 并以 任意顺序 返回剩下的文件夹 如果文件夹 folder i 位于另一个文件夹
  • 【ROS入门篇·一】ROS文件系统 & catkin编译系统

    快速链接 xff1a ROS入门篇 ROS学习简介 一 ROS工作空间创建 amp 编译 1 xff09 创建工作空间 mkdir p catkin ws src cd catkin ws src 2 xff09 创建功能包 catkin
  • 【ROS入门篇·五】launch文件使用 & 向节点传递参数

    快速链接 xff1a ROS入门篇 ROS学习简介 一 launch文件使用 1 1 launch文件简介 launch文件能够同时启动一个ROS Master和多个Node launch文件的标签 lt launch gt lt 根标签
  • 【ROS小车仿真·一】rviz中显示urdf模型

    快速链接 xff1a ROS小车仿真 从零实现gezebo小车仿真 一 urdf简介 URDF Unified Robot Description Format 统一机器人描述格式 xff0c URDF是使用XML格式描述机器人的文件 参考
  • 2.为什么要内存对齐?

    一 什么是内存对齐 xff08 Memory alignment xff09 xff0c 也叫字节对齐 在计算机中 xff0c 内存是按 字节 byte 1byte 61 8bit 划分的 xff0c 而cpu在读取内存数据时 xff0c
  • 问题笔记:STM32串口数据位与校验位

    问题 xff1a STM32移植freemodbus 后测试时 xff0c 只能使用无校验 xff0c 设置奇偶校验时无法与上位机通讯解决方法 如果串口助手使用串口配置为 xff1a 数据位8 停止位1 有奇偶校验 STM32需设置为 xf
  • 虚拟机使用pc摄像头

    1 win 43 r打开运行 2 在运行中键入services msc回车 xff0c 打开服务 3 右边下拉找到VMware Authorization Service 4 双击打开属性 xff0c 启动类型 gt 自动 xff0c 点击
  • sudo: 无法执行 ./configure: 没有那个文件或目录

    先说下环境 xff0c centos7 xff0c 编译srt时遇到的 看看是否存在这个文件 xff0c 如果存在 ll 查看是否是可执行的 xff0c 如果不可执行 sudo chmod span class token operator
  • 【Unity】为什么要用栈?

    今天看到一个UI界面使用了栈 xff0c 养成了写的习惯 xff0c 但是没有明白后面的道理 xff0c 自己查了很多资料 xff0c 发现很多人都在说后进先出 xff0c 但是也没有比较好的例子和解释 xff0c 直到遇见了这样的一个说法
  • printf打印long long类型数据

    用微妙做单位的话 xff0c 时间戳是16位数字 xff0c 应该用64位整形存储 xff0c long long 如果用printf打印的话 xff0c d默认是int类型 xff0c 打印long long int格式是 lld 打印l
  • h264和h265编码所需要的处理器性能

    h265压缩比为1 200 xff0c h264压缩比为1 100 xff0c 压缩一帧h265理论上比压缩一帧h264多10ms的时间 以下数据均来自实测 在Intel Core i7 6700 CPU 64 3 40GHz 4核8线程中
  • webrtc(native C++) + srs 拉流客户端

    webrtc编译h264使用openh264 解码使用ffmpeg解码 对于vp8 vp9解码也是使用ffmpeg 其实openh264库可以支持解码功能 这点不同于x264 但webrtc选择的是ffmpeg 可能是为了统一吧 首先在编译
  • openssl生成server.crt和server.key

    你可以使用 openssl 命令行工具来生成自签名的 SSL 证书和密钥 以下是步骤 xff1a 打开终端 输入以下命令 xff0c 生成私钥 xff08 server key xff09 xff1a openssl genrsa span
  • srs one2one,one2many通话环境搭建

    一 简介 二 go环境配置 三 srs编译配置 四 信令服务器编译 4 1 signaling8 4 2 web服务器 五 测试 六 附录 官 档参考地址 xff1a https github com ossrs srs wiki v4 C
  • srs 直播连麦环境搭建

    一 简介 二 修改conf rtc conf 三 两个客户端加入房间 四 合流 4 1分别拉流尝试 4 2合流推流 4 3拉取合流 一 简介 直播连麦是指在one2one或one2many进行音视频通话 xff0c 此时把他们的音视频流合在
  • DM-VIO安装与运行各类数据集

    1 论文地址 xff1a https vision in tum de media research vslam dm vio dm vio pdf https vision in tum de media research vslam d
  • sklearn风格的keras接口KerasClassifier、KerasRegressor

    span class token keyword from span tensorflow span class token punctuation span keras span class token punctuation span
  • python与java通信——使用socket模块

    前几天遇到个问题需要用python和java通信 xff0c 网上这种帖子很多 xff0c 比如runtime方法 xff0c py4j方法等 但是runtime方法似乎只能向python传参 xff0c 不能接受python传回 xff1
  • 简单移动平均SMA和指数移动平均EMA

    一 简单移动平均SMA 最近有一个平滑的需求 xff1a 设置平滑期数h xff08 奇数 xff09 xff0c 每期点平滑方法是 xff1a 取该期前后共m期 xff08 含本期 xff09 点的平均值 如果前或后没有足够的点则不用平滑

随机推荐

  • postman基础教程

    目录 一 postman安装说明 1 下载与安装 2 界面导航说明 3 发送第一个请求 二 postman基础功能 1 常见类型的接口请求 1 1 查询参数的接口请求 1 2 表单类型的接口请求 1 3 上传文件的表单请求 1 4 json
  • pandas使用分位数筛选满足条件的行

    分位数计算原理参见 python pandas 分位数 下面直接使用pandas的quantile方法 1 给个例子 span class token keyword import span pandas span class token
  • pandas str.endswith筛选结尾字符串为一个范围内的行

    span class token keyword import span numpy span class token keyword as span np span class token keyword import span pand
  • 聚类集成方法python实现(基于相似度、基于重标记法)

    一 写此篇的背景 有个同学给我两篇论文 基于聚类集成的特征选择方法研究 李玥 基于基聚类器对齐的聚类集成方法研究 杨康 xff0c 基于相似度的方法跟他讲了一遍他自己复现好了 xff0c 但是他觉得他的数据集有几万条 xff0c 时间和空间
  • pandas 如何获得每类A的月末数据B

    一 描述问题 如何取到下面这个dataframe中 xff0c 每一类Code对应的月末数据 df span class token operator 61 span pd span class token punctuation span
  • pandas groupby分组后对每个组进行fillna填值

    一 初始数据如下 xff0c 希望分组后 xff0c 组间数据互不干扰的填充 span class token keyword import span pandas span class token keyword as span pd s
  • VS2022配置Games101作业环境

    一 首先配置opencv4 43 contrib 1 opencv源码下载 访问github上的opencv主页 首先点进第一个opencv 我这里默认就是4 x xff0c 点开可以知道分支为4 x 还需要点Tags 我这里使用的是4 5
  • Games101 VS2022 C++ auto推断不出变量类型

    在写Games101 Homework2的时候 xff0c 下面这句的 auto推断不出3个变量的类型 span class token comment If so use the following code to get the int
  • 密度聚类:OPTICS算法详解

    很多人不理解OPTICS算法绘出的图该怎么理解 为什么波谷就算一类 xff0c 有个波峰又算另一类了 xff0c 本篇在第三部分的第2 3节详细讲这个是什么判别分类的 本篇会添加一些个人思考过程 xff0c 可能有不严谨的地方 xff0c
  • 密度聚类:OPTICS算法简单易懂版

    前几天写了一篇详解版 xff0c 感觉可能太详细了阅读量不高 xff0c 所以修改精简成这篇 很多人不理解OPTICS算法绘出的图该怎么理解 为什么波谷就算一类 xff0c 有个波峰又算另一类了 xff0c 本篇在第三部分的第2 3节详细讲
  • 跟着LearnOpenGL文档做的纹理显示不出来,但也不报错

    跟着LearnOpenGL文档入门章的纹理一节 xff0c 把源代码复制下载都运行不了 xff0c 有这么3条要注意的点 一 下载完stb image h xff0c 引用时要加上 define STB IMAGE IMPLEMENTATI
  • 【C++】一文搞懂C++中的std::是什么

    1 C 43 43 中的std 是什么 xff1f std 是个名称空间标示符 xff0c C 43 43 标准库中的函数或者对象都是在命名空间std中定义的 xff0c 所以我们要使用标准函数库中的函数或对象都要使用std来限定 标准库在
  • 详解GMM高斯混合模型EM模型

    一般讲到GMM就会讲到EM 我不过多的介绍EM算法 这里只是举一些例子来看看真实的GMM怎么用EM算的 一 GMM的作用 记住GMM的作用 xff0c 就是聚类 xff01 二 GMM有hard和soft两种 hard GMM和soft G
  • MiniAlphaGo黑白棋 蒙特卡洛搜索

    做个笔记 一 蒙特卡洛在黑白棋的应用 输入 xff1a 棋盘 x1d44f x1d45c x1d44e x1d45f x1d451 当前执子方 x1d450 x1d45c x1d459 x1d45c x1d45f 搜索时间 x1d461 x
  • 基于LLVM的C编译器--lcc——以CLion用SSH连接WSL Ubuntu22.04为例

    Windows 10 22H2CLion 2022 3 1Ubuntu 20 04 xff08 Microsoft Store内的WSL发行版 xff09 一 下载WSL xff0c 换源 xff0c 切换到WSL2 1 1 保证windo
  • Windows有CUDA但是没有nvcc命令

    明明有CUDA xff0c 但是cmd中输入nvcc V无效 但是如果打开anaconda prompt xff0c 输入nvcc V就有效 这可能是因为直接用的pytorch官网命令conda下载安装的 xff0c 然后又没有把anaco
  • win下配置pytorch3d

    一 配置好的环境 xff1a py 3 9 43 pytorch 1 8 0 43 cuda 11 1 cudnn 8 0 43 pytorch3d 0 6 0 43 CUB 1 11 0 你可能觉得pytorch3d 0 6 0版本有点低
  • 【pytorch3d】running build_ext error: [WinError 2] 系统找不到指定的文件

    在win10上安装pytorch3d时 xff0c 遇到如下错误 xff1a running build ext error span class token punctuation span WinError span class tok
  • windows下安装jax

    一 首先下载jaxlib 需要去这个非官方网站去找到适合自己的版本 xff0c 下载到本地 然后使用对应的虚拟环境pip install 该文件名即可 二 然后下载对应的jax 一行命令即可 pip span class token fun
  • STM32 HAL库串口收发数据

    STM32 HAL库串口收发数据 许多传感器的使用方法是 xff1a 单片机给传感器发送一帧数据 xff0c 然后传感器返回单片机一帧有用数据 xff0c 所以串口的收发功能十分重要 STM32cubeMX的配置 时钟和下载方式就不讲了 串