利用串口空閑中斷接收數據


 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     }

這個程序是為了使用串口中斷接收定長數據,協議里面只有協議頭沒有協議尾,這個程序解決了使用串口空閑中斷就馬上進入空閑中斷的問題,但返回之后要重新打開串口接受中斷才能正常使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM