【驱动】一种中断接收的不等长不规则uart数据机制

一种中断接收的不等长不规则uart数据机制

uart接收不规则的位置长度或者不固定长度的数据帧时判断是否接收完成一帧并可以进行处理的机制demo

	while(timeOut--)
	{
		if(NET_IO_WaitRecive() == REV_OK)//每过20ms判断一次
		{
//			if(strstr((const char *)UData.Rcv_Data, res) != NULL)
//			{
//				NET_IO_ClearRecive();
//				
//				return NETOK;
//			}
//      else if(strstr((const char *)UData.Rcv_Data, "ERROR") != NULL)
//      {
//          NET_IO_ClearRecive();
//          Timer2_Delay1ms(500);
//          
//          return ERR;
//      }
		}
		
		Timer2_Delay1ms(20);//200ms        
        
	}
/***************************************************************
* 函数名: NET_IO_WaitRecive
* 输入  : void
* 输出  : void
* 功能  : 等待模块返回buff   返回0代表ok		返回1代表未完成
****************************************************************/
unsigned char NET_IO_WaitRecive(void)
{

	if(UData.dataLen == 0) //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
		return REV_WAIT;
		
	if(UData.dataLen == UData.dataLenPre) //如果上一次的值和这次相同,则说明接收完毕
	{
		UData.dataLen = 0; //清0接收计数
			
		return REV_OK; //跳出
	}
		
	UData.dataLenPre = UData.dataLen; //置为相同
	
	return REV_WAIT;
}
/************************************************************************************
* 函数名:void SerialPort0_ISR (void)
* 输入  :void
* 输出  :void
* 功能  :UART0接收中断
*************************************************************************************/
void SerialPort0_ISR (void) interrupt 4 
{
     pdata u8 tmp;    
    
    if (RI==1) 
    {           
        /* if reception occur */
        clr_RI;                             /* clear reception flag for next reception */
        tmp = SBUF;
       
        UData.Rcv_Data[UData.dataLen++] = tmp;        
    }
    
//    if(TI==1)
//    {
//        clr_TI;                             /* if emission occur */
//    } 
   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值