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中的内容即为一组接收的一组数据。

版权声明:本文为CSDN博主「烂笔头Wille」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34913944/article/details/120917866

生成海报
点赞 0

烂笔头Wille

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

为什么重写printf函数没有用?

以前在网上找了无数方法去重写printf函数,但发现都没效果,今天偶然发现重写printf函数可以了,原因是以前没有勾选微库(Use MicroLlB)! 这里