rcv_buf[uart1_rx_count++] = SBUF; //将接收数据保存 上面是在串口接收中断里的,下面是在主函数里。
if((uart1_rx_count>=(Date_length-1))) //判断接收的数据是否达到长度
{
while(rcv_buf!=addr) //寻找地址位
{
i++; //send_UART_one(0);
if(i>=(Date_length-1)) //数据超过长度,重新计数
{
i=0;uart1_rx_count=0; //接收数据从头开始接收
}
}
if((i==0)&&(rcv_buf[4]==1))
{ send_UART_one(rcv_buf[0]);
for(ck=1;ck<Date_length-2;ck++) //校验和计算
{
check_sum = check_sum + rcv_buf[ck]; //将地址位和数据相加,得到第四个数据
}
send_UART_one(check_sum);
send_UART_one(rcv_buf[1]);
send_UART_one(rcv_buf[2]);
if((check_sum == rcv_buf[Date_length-2])) //判断校验和
{
send_UART_one(rcv_buf[0]);
send_UART_one(rcv_buf[1]);
uart1_rx_count=0; //为下一次中断做准备
check_sum=0; //校验和清零,准备下一次校验
if(rcv_buf[1]==0x01)
{
PWM_Var = rcv_buf[2];
send_UART_one(_OK_); //从机校验成功,反馈给主机0xff命令,回复应答
CCAP0H = CCAP0L = PWM_Var;
}
}
else
{
uart1_rx_count=0;check_sum=0; //校验和不正确,可能发生帧错误,重新开始
}
}
} |