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; } } }