[mw_shl_code=c,true]void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Temp_Clear_IDLE=Temp_Clear_IDLE;
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x4B)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了 //接收到'K'
}
else
{
if(Res==0x4F) //接收到'O'
USART_RX_STA|=0x4000;
else //还没收到'O'
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
//// if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) //空闲总线中断
//// {
// if((USART_RX_BUF[USART_RX_STA] == 0x4F)&&(USART_RX_BUF[USART_RX_STA+1] == 0x4B))
// {
// Temp_Clear_IDLE=USART1->SR;
// Temp_Clear_IDLE=USART1->DR;//清除USART_IT_IDLE位
//// USART_RX_STA =0;
// USART_RX_STA|=0x8000;
// }
//// }
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();
#endif
}[/mw_shl_code]
这个是我的中断服务程序,基本套用原子哥的,就只是把接收标志改为了OK 而已,但就出现了这样的情况。 |