尽量不要用delay。。。这不是RTOS
想要好的实时性,所有时基都应该由中断实现
这种东西要用状态机写的,你也没有判断是否存在数据,也没有做校验,都是不可靠的,有一个获取缓冲区有多少byte的函数
然后取一个数据,调用状态机去处理,类似下面我写的寄代码
while (Serial.available() > 0) //循环串口是否有数据
{
void Data_chuli(uint8_t readbit){
static uint16_t data_len=0,data_readlen=0,data_crc=0;
switch(uart_ztj){
case 0:
if(readbit==0xBE){
read_data[0]=readbit;
uart_ztj=1;
}
break;
case 1:
if(readbit==0xAA){
read_data[1]=readbit;
uart_ztj=2;
}else{
uart_ztj=0;
}
break;
case 2:
data_len=readbit;
read_data[2]=readbit;
uart_ztj=3;
break;
case 3:
data_len+=readbit<<8;
read_data[3]=readbit;
if(data_len<=DATA_BUF+1){
uart_ztj=4;
}else{
uart_ztj=0;
}
break;
case 4:
data_status=readbit;
read_data[4]=readbit;
if(data_len==1){
uart_ztj=6;
}else{
uart_ztj=5;
}
data_readlen=1;
break;
case 5:
read_data[data_readlen+4]=readbit;
data_readlen++;
if(data_readlen>=data_len){
uart_ztj=6;
}
break;
case 6:
data_crc=readbit;
uart_ztj=7;
break;
case 7:
data_crc+=readbit<<8;
uart_ztj=8;
break;
case 8:
if(readbit==0xEB){
uart_ztj=9;
}else{
uart_ztj=0;
}
break;
case 9:
if(readbit==0xAA){
uart_ztj=0;
if(CRC16_XMODEN(read_data,data_len+4)==data_crc){//成功接收
read_en=0;
}
}else{
uart_ztj=0;
}
break;
}
}