最近研究串口,发现一个问题。希望大侠指点下。
我本来想发CSFG。每次都是把接收到的数据打印一次。
是用一次中断完成的。
但是每次第四个字符总是接收不到。
我在串口调试工具上发,如果我发CSFG ,接收到的只是CSF。
如果我发的是CSFGH,那接收到的是CSFH。第四个被没有显示,取而代子的是第五个被显示了。
不知道原因在哪里。
求高手指点
本人QQ(331797996)
源代码如下:
void USART3_IRQHandler(void)
{
u32 i=0,T_flag=0;
USART3_Get_Data[0]=USART3_Get_Data[1]=USART3_Get_Data[2]=USART3_Get_Data[3]=USART3_Get_Data[4]=0;
USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
if(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==SET)
{
//while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==RESET);
USART_ClearITPendingBit(USART3,USART_IT_RXNE); //这个相当于把 USART_FLAG_RXNE 清0.实际上可以不写 因为每读取一次数据,会自动把其清0
USART3_Get_Data[0] = USART_ReceiveData(USART3);
USART_ClearFlag(USART3,USART_FLAG_ORE);
//printf("dxx");
}
if('c'==USART3_Get_Data[0])
{
printf("%c",USART3_Get_Data[0]);
for(i=0;i<13300;i++) ; //这个延时是为了让下一个字节数据传到寄存器,若无延时 USART_FLAG_RXNE 可能还是0.
if(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==SET)
{
//USART_ClearITPendingBit(USART3,USART_IT_RXNE);
USART3_Get_Data[1] = USART_ReceiveData(USART3);
USART_ClearFlag(USART3,USART_FLAG_ORE);
}
}
if('s'==USART3_Get_Data[1])
{
printf("%c",USART3_Get_Data[1]);
for(i=0;i<13300;i++);
if(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==SET)
{
USART3_Get_Data[2] = USART_ReceiveData(USART3);
USART_ClearFlag(USART3,USART_FLAG_ORE);
}
}
if('f'==USART3_Get_Data[2])
{
//printf("f");
printf("%c",USART3_Get_Data[2]);
printf(" ");
for(i=0;i<13300;i++)
if(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==SET)
{
printf("ok");
USART3_Get_Data[3] = USART_ReceiveData(USART3);
printf("%c",USART3_Get_Data[3]);
break;
}
}
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
} |