×
单片机 > 单片机程序设计 > 详情

STM32-串口超时判断方式接收未知长度数据

发布时间:2020-09-02 发布时间:
|
usart.c串口中断处理函数:

 

[cpp] view plaincopy
 
  1. void USART1_IRQHandler(void)  
  2. {      
  3.     u8 res;       
  4.     if(USART1->SR&(1<<5))//接收到数据  
  5.     {      
  6.         res=USART1->DR;             
  7.         if(USART1_Recv_Len
  8.         {  
  9.             TIM3->CNT=0;                             //计数器清空  
  10.             if(Rec_Over_Flag==0)TIM3_Set(1);        //使能定时器4的中断   
  11.             USART1_RX_BUF[USART1_Recv_Len++]=res;       //记录接收到的值      
  12.         }else   
  13.         {  
  14.             Rec_Over_Flag=1;                    //强制标记接收完成  
  15.         }   
  16.     }                                              
  17. }   
  18. timer.c定时器中断函数  
  19. //定时器3中断服务程序       
  20. void TIM3_IRQHandler(void)  
  21. {                                     
  22.     if(TIM3->SR&0X0001)//溢出中断  
  23.     {     
  24.         Rec_Over_Flag=1;  
  25.         TIM3->SR&=~(1<<0);     //清除中断标志位  
  26.         TIM3_Set(0);  
  27.         LED1=!LED1;      //RxTimeout等于0,变换LED1表明该次发送结束                                                            
  28.     }                             
  29. }  
  30. //设置TIM4的开关  
  31. //sta:0,关闭;1,开启;  
  32. void TIM3_Set(u8 sta)  
  33. {  
  34.     if(sta)  
  35.     {  
  36.         TIM3->CNT=0;         //计数器清空  
  37.         TIM3->CR1|=1<<0;     //使能定时器3  
  38.     }else TIM3->CR1&=~(1<<0);//关闭定时器3       
  39. }  

 

main.c主函数

 

[cpp] view plaincopy
 
  1. int main(void)  
  2. {             
  3.     u8 t;  
  4.     u8 Password[7]="123456";  
  5.     u8 Tishi1[]="操作码长度不对";  
  6.     u8 Tishi2[]="操作码不正确";  
  7.     u8 Tishi3[]="指令成功执行!";  
  8.     u16 times=0;    
  9.     Stm32_Clock_Init(9); //系统时钟设置  
  10.     delay_init(72);      //延时初始化   
  11.     uart_init(72,57600);     //串口初始化为57600  
  12.     LED_Init();          //初始化与LED连接的硬件接口   
  13.     Timerx_Init(99,7199);  //10kHz的技术频率,计数到100为10ms  
  14.     while(1)  
  15.     {     
  16.         if(Rec_Over_Flag==1)  
  17.         {                        
  18.             if(USART1_Recv_Len!=0x06)  //USART1_Recv_Len接收数据的长度不等于6  
  19.             {   
  20.                 Putstrings(Tishi1);  
  21.             }  
  22.             else                       // USART1_Recv_Len接收数据的长度等于6  
  23.             {  
  24.                 for(t=0;t
  25.                 {  
  26.                     if(USART1_RX_BUF[t]!=Password[t])  
  27.                     {  
  28.                         Putstrings(Tishi2);  
  29.                         break;  
  30.                     }  
  31.                     else if(t==(USART1_Recv_Len-1))  
  32.                     {  
  33.                         Putstrings(Tishi3);  
  34.                         LED0=!LED0;  
  35.                     }  
  36.                 }  
  37.             }  
  38.             Rec_Over_Flag=0;  
  39.             USART1_Recv_Len=0;    
  40.         }  
  41.         else  
  42.         {  
  43.             times++;  
  44. //          if(times%30==0)LED1=!LED1;//闪烁LED,提示系统正在运行.  
  45. //          if(times%30==0)RxTimeout--;   
  46.             delay_ms(10);             
  47.         }      
  48.     }   
  49. }  
  50. //------------输出字符串到串口-------------------  
  51. void Putstrings(u8 *ptr)  
  52. {  
  53.     while(*ptr!=')  
  54.     {  
  55.         USART1->DR=*ptr++;  
  56.         while((USART1->SR&0X40)==0);//等待发送结束  
  57.     }  
  58.     USART1->DR=;  
  59. }  

 

[cpp] view plaincopy
 
  1.   
  2.   
  3.   
  4.   
  5.   
  6.   
  7.   
  8.   
  9.      
  10.   
 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录