//用 if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) 判断一帧数据是否接收完成不好用,请帮忙分析,谢谢!//现在遇到的问题是,接收到一帧数据并返回后,再次等待接收,在上位机没有发任何数据的情况下,LED0会亮
//请问是不是 USART_GetITStatus(USART2, USART_IT_IDLE) != RESET 不能准确的判断一帧数据是否接收完成
//如过能这样用起来的话,程序看起来将会很清晰
//接收中断函数
void USART2_IRQHandler(void) //数据接收中断
{
u8 Clear=Clear;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //如果接收到了1个字节
{
if(RCV_Num_Temp<64)
{
RCV_Buffer_Temp[RCV_Num_Temp++]=USART2->DR; //读取收到的数据,清除RXNE中断
LED0=0; //接收指示
}
}
else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) //如果接收到了1帧数据
{
LED0=1;
Clear=USART2->SR; //读SR寄存器
Clear=USART2->DR; //读DR寄存器(先读SR再读DR,就是为了清除IDLE中断
RCV_Complete_Temp=1; //一帧接收完成临时缓存(1为完成)
}
}
//数据帧接收函数,RXNE中断使能,IDLE中断使能,是在调用 RS485_Receive_Data() 前使能的
void RS485_Receive_Data(void)
{
u8 i;
if(RCV_Complete_Temp==1) //如果接收完1帧数据,则开始另存
{
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE); //关RXNE中断使能
USART_ITConfig(USART2,USART_IT_IDLE,DISABLE); //关IDLE中断使能
RCV_Num=RCV_Num_Temp;
for(i=0;i<RCV_Num;i++)
{
RCV_Buffer[i]=RCV_Buffer_Temp[i];
RCV_Buffer_Temp[i]=0X00; //清除接收到的一帧完整数据帧临时缓存
}
RCV_Num_Temp=-1; //数据帧字节长度临时缓存设初值
SEND_Complete_Temp=0;
RCV_Complete=1; //置位接收完成标志
delay_ms(1);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>