C ~ 一个串口接收思路
void uart_rx_isr(void) //接收中断函数 { uchar c; c=SBUF;//c等于接收的字节; switch (recv_state) { case 0: if (c==0x02) // 是数组第一字节 { recv_state=1; // 进入下一个状态 } else recv_state=0; // 回到初始状态 break; case 1: if (c!=0xff) // 是数组第二字节 拢共 3位数据 中间这位 为数据位 就不进行校验判断了 { recv_state=2; // 进入下一个状态 Rx_Data=SBUF; //把 这个数据 纪录下来 作为 后面的判断 } else { recv_state=0; // 回到初始状态 } break; case 2: if (c==0x03) // 是数组第三字节 { // recv_state=3; // 进入下一个状态 Flag=1; recv_state=0; // 回到初始状态 } else { recv_state=0; // 回到初始状态 } break; } } void UART_interrupt() interrupt 4 { if(RI==1)//如果接收了数据(RI会置1) { RI=0; //先清零,下次可以在接收数据 uart_rx_isr(); //调用数据判断这个函数 } }
串口数据串位后进行排列
void RecvDataDispose(uint8_t *Buff)
{
uint8_t i=0;
uint8_t TempBuff[16]={0};
for(i = 0;i<16;i++)
{
if(i<=12)
{
if((DisposeData[i] == 0xAA)&&(DisposeData[i+1] == 0xBB)&&(DisposeData[i+2] == 0xCC)&&(DisposeData[i+3] == 0xDD)) //Ö¡Í·³öÏÖ
{
memcpy(TempBuff,DisposeData+i,16-i);
memcpy(TempBuff+16-i,DisposeData,i);
memcpy(FinalData,TempBuff,16);
break;
}
}
else
{
memcpy(TempBuff,DisposeData+13,3);
memcpy(TempBuff+3,DisposeData,13);
memcpy(DisposeData,TempBuff,16);
for(i=0;i<=12;i++)
{
if((DisposeData[i] == 0xAA)&&(DisposeData[i+1] == 0xBB)&&(DisposeData[i+2] == 0xCC)&&(DisposeData[i+3] == 0xDD)) //Ö¡Í·³öÏÖ
{
memcpy(TempBuff,DisposeData+i,16-i);
memcpy(TempBuff+16-i,DisposeData,i);
memcpy(FinalData,TempBuff,16);
break;
}
}
break;
}
}
}

浙公网安备 33010602011771号