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