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. }
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
tiannanxingyu
1楼-- · 2019-07-15 23:44
void USART1_IRQHandler(void)
{
        unsigned char temp=0;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                temp=(unsigned char)USART_ReceiveData(USART1);
                if(RxBuf1CNT<SERIAL_BUFF_SIZE)
                {
                        RxBuf1[RxBuf1CNT++]=temp;
                }
                else
                {
                        RxBuf1CNT=0;
                }
        }
}
我是这么用的,可以正常使用,是不是你的USART初始化有问题。 最佳答案
24不可说
2楼-- · 2019-07-16 01:31
连接驱动没有问题吧
1115775845@qq.c
3楼-- · 2019-07-16 01:59
 精彩回答 2  元偷偷看……

一周热门 更多>