当前位置:   article > 正文

STM32串口空闲中断接收不定长数据

STM32串口空闲中断接收不定长数据

1. 开启串口空闲中断

最近接触到的 Modbus RTU 项目使用到了串口接收中断和空闲中断。记录一下

初始化可以直接套用正点原子的初始化,只需要添加一行即可

  USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口空闲中断
}
  • 1
  • 2

2. 合理开关中断

FreeRTOS是不能一直串口空闲中断之中的。

我们可以使用这种中断方式来处理:在接收完数据后,开启串口空闲中断;随后在接收完毕后,会触发空闲中断,将数据全部打印出来,此时CPU会归还给任务调度器并使其恢复任务调度。

函数是修改的正点原子的,现在不需要在尾部加入 “\r\n” 也能照常使用。

void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  //空闲中断
	{
		printf("%s\n",USART_RX_STA);
		
		USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);//关闭串口空闲中断
	}

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		USART_RX_BUF[USART_RX_STA]=Res ;
		USART_RX_STA++;
		if(USART_RX_STA>(USART_REC_LEN-1))
			USART_RX_STA=0;//接收数据错误,重新开始接收
    	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口空闲中断
    } 
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3. 串口发送函数

还写了一个发送函数,以后调试不愁printf函数只能一个串口用了。

void STMLOG(USART_TypeDef* USARTx, u8 *Data)
{
	while(*Data!='\0')
	{ 
		 while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET); 
		 	USART_SendData(USARTx,*Data);
		 Data++;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/718918
推荐阅读
相关标签
  

闽ICP备14008679号