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

2008-11-24 14:40 11727 6 11 分类: MCU/ 嵌入式

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

我要用STM32的串口接收一帧这样的类型的数据:01 xx xx xx xx xx xx xx FD   这个数据总长度不超过30个,但是不定长,也许是3个,也许是25个等等,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就推出中断。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是不能这样接收,不知道为什么啊????????????现在的问题是能进中断,只能接收到第一个数据,后面的数据就无法接收到了,为什么呢?比特率是9600。如果不在中断里面接收完数据的话,那么用一次只接收一个数据,好像很难处理到什么时候是这一帧的数据噢?因为数据长度是不一定的啊!!????请赐教,谢谢!!!代码如下:

void SysTick_Handler(void)
{
   if (TimingDelayBuffer != 0x00)
   { 
      TimingDelayBuffer--;
   }
}

void USART1_IRQHandler (void) 
{
   unsigned char i = 0;

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

   while (!(USART1->SR & USART_FLAG_RXNE))
   {
     if (TimingDelayBuffer == 0) //定时一秒没有数据就退出
     {
      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt 
      return;
     }
     
   }
   
   SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数
     SysTick->VAL = SysTick_Counter_Clear; //计数器清0
     
       RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));
       USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag
       
   if (RxBuffer[RxCounter] == 0xFD)
   {
    RxdDisposeFlag = 1; 
    return; 
   }
   
   RxCounter++;
  }
  
      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt 
     }
}

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户377235 2013-3-18 12:55

呵呵。

用户1017182 2009-12-24 20:55

意思就是每次进一次中断只能接收一个字节,不能在中断里面循环接收数据,真是不解ST公司啊!这么大的瑕疵啊!

用户1409704 2009-12-22 13:46

为什么不能这么用,应该怎么用才行,到底能不能用中断收数。说明白点儿啊。怎么解决的。我现在也遇到同样的问题了。

用户1017182 2009-12-9 20:20

ST公司原厂的说了STM32的串口不能够这样使用,很是不解啊!

cnchip_906380433 2009-12-7 21:10

我好像与你遇到了同样的问题,解决了吗? 哇,原来是去年的了啊

用户1383868 2007-5-5 09:12

C1是降压电容

R1是关断电源后C1的电荷泄放电阻

相关推荐阅读
用户1017182 2016-03-20 13:49
STM8-STVD(COSMIC)定义变量指定其类型和位定义
stm8 stvd下near等于51的xdatatiny等于51的idata 如何分配变量到指定的地址 举例: unsigned ch...
用户1017182 2016-03-05 21:59
磁保持继电器的效率问题
怎样才能最大化的发挥磁保持继电器的优势呢?...
用户1017182 2014-05-03 14:38
指示电量不足的简单电路设计
图中所示的设计实例可指示使用四节AA电池供电的音频测试仪器出现的电量不足状态。由于该仪器采用的是分立式设计,相较于单一来源的集成电路,该相同方法看似更符合项目初衷。   普通的红色LED既...
用户1017182 2014-05-03 14:19
source insight调用Keil编译器并且定位到错误行
  EDN博客精华文章  作者:mubo   效果图如下: 点击看原图   下面是实现方法:   1、Source Insight -> Options -> Custom Comma...
用户1017182 2014-05-03 14:13
解决source insight输入中文间距大,删除键Del键左右方向光标半个汉字的问题
在默认情况下,往Source Insight里输入中文,字间距相当的大,下面将帮助你解决这个问题。具体设置如下:1.Options->Style Properties2. 在左边Style Na...
用户1017182 2013-07-06 10:33
评论:@汽车电子设计之路 博客中提到的“功率Mosfet参数介绍”
好...
我要评论
5
6
关闭 站长推荐上一条 /3 下一条