?STM32的空闲中断,看到网上的介绍说,数据流间隔超过一字节时间没接收到数据就会产生一个空闲总中断,这样我们就可以应用与一帧数据流的判断,这样就可以无需缓存解析处理串口数据,前提是命令接收间有间隔,否则很容易出现解析命令不完整
void USART2_IRQHandler(void)
{
static u8 buf[100]={0};
static u8 bufLen = 0;
if(USART2->SR&(1<<5))
{
//缓存接收的数据
if(bufLen>=sizeof(buf))bufLen = 0;
buf[bufLen++] = USART_ReceiveData(USART2);
//使能串口的空闲中断
USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
}
//空闲中断(一帧数据)
if(USART_GetITStatus(USART2,USART_IT_IDLE) != RESET)
{
USART_ITConfig(USART2,USART_IT_IDLE,DISABLE);
//处理帧数据
for(u8 i=0;i<bufLen;i++)
{
que_Write(&Rx2_que,buf[i]);
}
bufLen = 0;
}
}
可以不关空闲中断也可以,清除空闲中断方法
?
//空闲中断(一帧数据)
if(USART_GetITStatus(USART2,USART_IT_IDLE) != RESET)
{
// USART_ITConfig(USART2,USART_IT_IDLE,DISABLE);
u16 temp = USART2->SR;
temp = USART2->DR;
//处理帧数据
for(u8 i=0;i<bufLen;i++)
{
que_Write(&Rx2_que,buf[i]);
}
bufLen = 0;
}
|