问题需求:
用上位机发一串数据给MCU,通过串口中断,分别存到两个BUF数组,每个数组最多装3个字节,装满就触发一个FULL全局变量,然后在main中打印出满了的BUF的内容。
现状,单条发送有问题,多条循环发送没问题。
[mw_shl_code=c,true]void USART2_IRQHandler(void) //串口2中断服务程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();
#endif
static u8 flag =0;
if ((USART_GetITStatus(USART2, USART_IT_RXNE) != RESET))//不可以这个if((USART_GetITStatus(USART2, USART_IT_RXNE) != RESET))
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志
Res =USART_ReceiveData(USART2);//(USART1->DR); //读取接收到的数据
if(flag==0)//buf[]
{
USART_RX_BUF[USART_RX_STA]=Res;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))
{
//buf 满了
flag=1;
BUF_FULL=1;
USART_RX_STA=0;
}
}
else //(flag==1)//buf_sub[]
{
USART_RX_BUF_SUB[USART_RX_STA_SUB]=Res;
USART_RX_STA_SUB++;
if(USART_RX_STA_SUB>(USART_REC_LEN-1))
{
//buf 满了
flag=0;
BUF_SUB_FULL=1;
USART_RX_STA_SUB=0;
}
}
//USART_ClearFlag(USART2,USART_FLAG_TC);//中断完成后清除TC
}
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();
#endif
}
#endif [/mw_shl_code]
[mw_shl_code=c,true]while(1)
{
if((BUF_FULL==1) )
{
//len=USART_RX_STA&0x3fff;
//printf("\r\n您发送的消息为:\r\n");
//printf("\r\n您发送的消息长度为%d:\r\n",len);
for(t=0;t<USART_REC_LEN;t++)
{
printf(&quot;BF_buf_nun_is:%c\r\n&quot;,USART_RX_BUF[t]);
}
//USART_RX_STA=0;//计数清零
BUF_FULL=0;
}
else if(BUF_SUB_FULL ==1)
{
// len=USART_RX_STA_SUB&0x3fff;
//printf(&quot;\r\n您发送的消息为:\r\n&quot;);
// printf(&quot;\r\n您发送的消息长度为%d:\r\n&quot;,len);
for(t=0;t<USART_REC_LEN;t++)
{
printf(&quot;B_S_F_buf_nun_is:%c\r\n&quot;,USART_RX_BUF_SUB[t]);
}
//USART_RX_STA_SUB=0;//计数清零
BUF_SUB_FULL = 0;
}
}[/mw_shl_code] |