打印

stm32串口接收数据只能接收三个?

[复制链接]
6300|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
styeven|  楼主 | 2011-12-12 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近研究串口,发现一个问题。希望大侠指点下。
我本来想发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);  
}
沙发
香水城| | 2011-12-12 15:12 | 只看该作者
发完最后一个字符后作了什么?

使用特权

评论回复
板凳
styeven|  楼主 | 2011-12-12 16:57 | 只看该作者
我本来是要做中断的 ,如果全部接收到就把一个给定的值置1,在主函数的时候查询他再执行下一个操作。
字符的接受只是我发的命令有4个字符。
现在只是想把每个字符都接收到。但是结果第四个字符经常都接收不到(偶尔成功)。USART_FLAG_RXNE也都是经常都是0,偶尔才是1.理论上是每发一个字符就应该变为1了。

使用特权

评论回复
地板
styeven|  楼主 | 2011-12-12 16:58 | 只看该作者
我本来是要做中断的 ,如果全部接收到就把一个给定的值置1,在主函数的时候查询他再执行下一个操作。
字符的接受只是我发的命令有4个字符。
现在只是想把每个字符都接收到。但是结果第四个字符经常都接收不到(偶尔成功)。USART_FLAG_RXNE也都是经常都是0,偶尔才是1.理论上是每发一个字符就应该变为1了。 3# styeven

使用特权

评论回复
5
a7208184| | 2011-12-16 16:23 | 只看该作者
也就是你是轮询接收的,如果是偶尔成功的话,我觉得有可能是数据丢掉了

使用特权

评论回复
6
Euphorix| | 2014-6-12 21:32 | 只看该作者
请问问题解决没?为什么不用中断?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

20

帖子

1

粉丝