IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 HAL库串口收发数据 -> 正文阅读

[嵌入式]STM32 HAL库串口收发数据

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);
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:30:12  更:2021-11-22 12:30:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:42:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码