STM32 UART串口在中断中不能循环接收数据帧的问题

2019-07-15 17:54发布

STM32 UART串口在中断中不能循环接收数据帧的问题

我要用STM32的串口接收一帧这样类型的数据:01 xx xx xx xx xx xx xx FD  
这个数据长度不超过30个,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就退出中断(中间断接收超时处理)。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是在中断中不能根据USART_FLAG_RXNE标志来完成数据帧接收,

不知道为什么啊?代码如下:

  1. void Systick_Handler(void)
  2. {
  3.    if (TimingDelayBuffer != 0x00)
  4.    {
  5.       TimingDelayBuffer--;
  6.    }
  7. }

  8. void USART1_IRQHandler (void)
  9. {
  10.    unsigned char i = 0;

  11.      if (USART1->SR & USART_FLAG_RXNE)   // read interrupt
  12.      {
  13.       USART1->CR1 &= USART_FLAG_RXNE;          // Disable the USART Receive interrupt
  14.       
  15.       RxCounter = 0;
  16.       RxBuffer[RxCounter++] = ((int)(USART1->DR & 0x1FF));
  17.       USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag
  18.   
  19.   for (i=0; i<30; i++)
  20.   {
  21.    SysTick->CTRL |= SysTick_Counter_Enable; //允许计数//用SysTick做的一个定时器。
  22.    TimingDelayBuffer = 1000;

  23.    while (!(USART1->SR & USART_FLAG_RXNE))
  24.    {
  25.      if (TimingDelayBuffer == 0) //定时一秒没有数据就退出
  26.      {
  27.       USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt
  28.       return;
  29.      }
  30.      
  31.    }
  32.    
  33.    SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数
  34.      SysTick->VAL = SysTick_Counter_Clear; //计数器清0
  35.      
  36.        RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));
  37.        USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag
  38.       
  39.    if (RxBuffer[RxCounter] == 0xFD)
  40.    {
  41.     RxdDisposeFlag = 1;
  42.     return;
  43.    }
  44.    
  45.    RxCounter++;
  46.   }
  47.   
  48.       USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt
  49.      }
  50. }
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。