1. 程式人生 > >利用串口空閑中斷接收數據

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

數據 art clas 程序 get ++ +++ 打開 oid

 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 }

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

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