我写了个串口中断485收发数据的代码,外部发一帧数据主程序进行相应的操作。现在的情况是我的程序只能执行一次相应的操作。然后串口要发很多次命令我的程序才能响应一次。不知道问题出在哪儿,请大家帮忙看看,谢谢!
这是我的中断处理代码。
[mw_shl_code=c,true]void USART2_IRQHandler(void)
{
extern u8 Addr_Buffer[2];
extern u8 Command_Buffer[2];
extern u8 Con_len_Buffer[2];
extern u8 Content_Buffer[2];
extern u8 CheckSum_Buffer[2];
extern u8 Rec_Sucess_Flag;
u8 data;
u16 tmp;
static u8 RecState=Head1;
static u8 len=0;
static u8 len_total=0;
static u8 head1_flag=0;
static u8 head2_flag=0;
static u8 Addr_flag=0;
static u8 Command_flag=0;
static u8 Con_len_flag=0;
static u8 CheckSum_flag=0;
static u16 CheckSum=0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
/*Clear flag*/
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
data=USART_ReceiveData(USART2);
switch(RecState)
{
case Head1:
if(data==0xee)
{head1_flag++;}
if((data==0x19)&&(head1_flag==0x01))
{
RecState=Head2;
head1_flag=0x00;
}
break;
case Head2:
if(data==0xee)
{head2_flag++;}
if((data==0x19)&&(head2_flag==0x01))
{
RecState=Addr;
head2_flag=0x00;
}
break;
case Addr:
Addr_Buffer[Addr_flag]=data;
CheckSum= CheckSum+ Addr_Buffer[Addr_flag];
Addr_flag++;
if (Addr_flag==0x02)
{
RecState=Command;
Addr_flag=0x00;
}
break;
case Command:
Command_Buffer[Command_flag]=data;
CheckSum= CheckSum + Command_Buffer[Command_flag];
Command_flag++;
if (Command_flag==0x02)
{
RecState=Con_len;
Command_flag=0x00;
}
break;
case Con_len:
Con_len_Buffer[Con_len_flag]=data;
CheckSum= CheckSum + Con_len_Buffer[Con_len_flag];
Con_len_flag++;
if (Con_len_flag==0x02)
{
RecState=Content;
Con_len_flag=0x00;
}
break;
case Content:
tmp=0x00;
tmp= Con_len_Buffer[0];
tmp=tmp<<8;
len_total= tmp|Con_len_Buffer[1];
if (len_total==0x00)
{
RecState=Check;
len=0x00;
}
else
{
Content_Buffer[len]=data;
CheckSum= CheckSum + Content_Buffer[len];
len++;
if(len>=len_total)
{
RecState=Check;
len=0x00;
len_total=0x00;
}
}
break;
case Check:
CheckSum_Buffer[CheckSum_flag]=data;
CheckSum_flag++;
if (CheckSum_flag==0x02)
{
tmp=0x00;
tmp= CheckSum_Buffer[0];
tmp=tmp<<8;
if(CheckSum==(tmp|CheckSum_Buffer[1]))
{
RecState=End1;
CheckSum=0x00;
CheckSum_flag=0x00;
}
}
break;
case End1:
if (data==0x03)
{RecState=End2;}
break;
case End2:
if (data==0x03)
{
Rec_Sucess_Flag=TRUE;
}
RecState=Head1;
break;
default:
RecState=Head1;
break;
}
}
}[/mw_shl_code]
|