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如何通过串口接收一组数据,不需要数据有结束符 -> 正文阅读

[嵌入式]STM32如何通过串口接收一组数据,不需要数据有结束符

STM32中串口的接收中断函数为:void USART1_IRQHandler(void),串口接收一个字节触发中断函数。原子哥的例程中,以串口1为例

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART_RX_STA&0x4000)//接收到了0x0d
			{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
			}
			else //还没收到0X0D
			{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}   		 
  } 
} 

原子哥的例程中接收的数据必须以换行字符作为结尾才能代表一组数据接收完毕,当然结束符可以更改。那我们能不能接收一组数据时候不需要进行添加结束符呢,回答当然是可以的。往往一组数据与一组数据之间会有间隔时间,如果这个时间存在,那么添加空闲中断使能即可。具体为在串口的初始化中添加一行使能中断空闲:

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//空闲中断使能

在串口接收中断中改为:

u8 RS485_RX_BUF_1[USART_REC_LEN_1];     //接收缓冲,最大USART_REC_LEN个字节.
u8 RX_1_Cnt=0;//接受的数据长度
void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据
	{
		RS485_RX_BUF_1[RX_1_Cnt++] =USART_ReceiveData(USART1);//读取接收到的数据USART1->DR
     if(RX_1_Cnt>=USART_REC_LEN_1)RX_1_Cnt=0;//每包的数据不能够大于数组定义的长度 	
	
	  USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志位
	}
   if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//接收完成后进入空闲中断
	 {
			USART1->SR;//先读SR,再读DR才能完成idle中断的清零,否则会一直进入中断
		    USART1->DR;
		   RX_1_Cnt=0;//需要清零
	
	 }
   	
}	

注意清除空闲中断标志位要用到 USART1->SR;USART1->DR;用USART_ClearITPendingBit(USART1,USART_IT_IDLE)是没用的,具体可以看手册。
那么接下来分析数组RS485_RX_BUF_1中的内容即为一组接收的一组数据。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:04:06  更:2021-10-24 15:05:13 
 
开发: 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 6:21:15-

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