如何利用串口空闲中断接收数据

1 void USART2_IRQHandler(void)2 { 3 使能串口空闲中断4 USART
 1 void USART2_IRQHandler(void)
 2 {    
 3           // 使能串口空闲中断
 4              USART_ITConfig(USART2, USART_IT_IDLE , ENABLE);
 5             
 6             if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)
 7             {
 8                  
 9                 rx_buf[cnt]=USART_ReceiveData(USART2);
10                 rx_rxbuf[cnt] = rx_buf[cnt] ;//把接收到的数组存到备用的数组当中,防止其被新的数值覆盖
11                     rx_rxbuf_i=cnt;//把接收到的数组数目存到备用的数组数目当中,防止其被新的数值覆盖
12                     cnt++;
13               USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除接收标志位
14             }
15 
16             
17 //如果为空闲总线中断,判断是否发生了空闲总线中断,检测传输的值,若发生传输误差,做出相应的回应处理。
18             
19     if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
20     {      
21 //此处为调试信息,把接收到的数据打印到串口1        
22              u8 i_i=0;
23              unsigned short sum_cf=0;
24              printf("\r\n++++++++串口空闲中断+++++++\n\r");
25         
26              USART_ClearITPendingBit(USART2,USART_IT_IDLE); 
27         
28         
29              if((cnt==9)||(cnt==10)||(cnt==11)) 
30                {
31                  
32                printf("\r\n++++++++数据数目大小发送正确+++++++\n\r");
33                             
34                } 
35                else
36                {
37                    
38                    
39                USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
40                   //此处为调试信息,把接收到的数据打印到串口1        
41                                 
42                 printf("\r\n++++++++数据发错了,重新发送一次+++++++\n\r");
43                  cnt=0;                   
44                  wait=4;                 
45                }                   
46     
47         
48                 if((cnt==9)&&(rx_buf[cnt-1]==32)) 
49                {
50                  USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
51                  rx_rxbuf_i=cnt;             
52                    wait = 9;
53                      cnt=0;                     
54                 printf("\r\n++++接收到的数据,断开蓝牙的信息++++\n\r");
55                             
56                }    
57         
58               if((cnt==10)&&(rx_buf[cnt-5]==1)&&(ws_1==0)) 
59                {
60                  USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
61                  rx_rxbuf_i=cnt;         
62                    wait = 2;
63                      cnt=0;                     
64                 printf("\r\n++++接收到的数据,握手信息++++\n\r");
65                             
66                }
67                           
68                if((cnt==11)&&(rx_buf[cnt-6]==2)) 
69                {
70                  USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
71                    rx_rxbuf_i=cnt; 
72                     wait=3;
73                      cnt=0;  
74                 }    
75             USART_ITConfig(USART2,USART_IT_IDLE,DISABLE);//失能串口空闲中断
76         
77                 
78     }

这个程序是为了使用串口中断接收定长数据,协议里面只有协议头没有协议尾,这个程序解决了使用串口空闲中断就马上进入空闲中断的问题,但返回之后要重新打开串口接受中断才能正常使用。