如何判断一组数据是否发送完毕

采用缓冲数组加定时器的方式

首先定义一个标志位USART3_RX_STA,标志位的最高位判断数据是否收发完毕,1表示接收完毕,0表示没有接收完毕。采取的机制是定时器定时时间一到定时器中断就将USART3_RX_STA最高位置1,而串口中断要做的就是在定时间到之前及时将定时器的计数器清0,防止USART3_RX_STA最高位置1。这样的话连续的数据接收时间差不超过定时时间,USART3_RX_STA最高位也不会被置1。也就是认为连续的数据接收时间差不超过定时时间那么这两个数据同属一组数据。

 1 void TIM7_IRQHandler(void)
 2 {         
 3     if(TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)//是更新中断
 4     {                    
 5         TIM_ClearITPendingBit(TIM7, TIM_IT_Update  ); //清除TIM7更新中断标志    
 6         
 7         USART3_RX_STA|=1<<15;     //标记接收完成
 8         TIM_Cmd(TIM7, DISABLE); //关闭TIM7 
 9     }        
10 }
11 
12 //如果2个字符接收间隔超过timer,则认为不是1次连续数据
13 //接收到的数据状态
14 //[15]:0,没有接收到数据;1,接收到了一批数据.
15 //[14:0]:接收到的数据长度
16 vu16 USART3_RX_STA=0;       
17 
18 void USART3_IRQHandler(void)
19 {
20     u8 res;          
21     if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
22     {     
23         res =USART_ReceiveData(USART3);         
24         //timer.c里有个定时器中断,定时器10ms进一次中断将USART3_RX_STA第15位置1代表本次数据传输完成,不会进入if也就不会往USART3_RX_BUF[USART3_RX_STA++]写入数据
25         //也就是说它认为每10ms是一次数据的传输,超过10ms就是下一次数据了
26         if((USART3_RX_STA&(1<<15))==0)              
27             
28         { 
29             if(USART3_RX_STA<USART3_MAX_RECV_LEN)    //数据的接收不能超过最大长度
30             {            
31                 TIM_SetCounter(TIM7,0);             //计数器清空                          
32                 if(USART3_RX_STA==0)                 //使能定时器7的中断 
33                 {
34                   TIM_Cmd(TIM7,ENABLE);           //使能定时器7
35                 }
36 
37                 USART3_RX_BUF[USART3_RX_STA++]=res;    //记录接收到的值     
38             }else 
39             {
40                 USART3_RX_STA|=1<<15;                //如果超过最大长度强制标记接收完成
41             } 
42         }
43     }                                                                
44 }   

 

posted on 2024-02-02 16:49  小凉拖  阅读(18)  评论(0编辑  收藏  举报