一种中断接收的不等长不规则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 */
// }
}