main()
{
while(1){
if(Receiver_Count>0) //如果串口中断接收到数据,侧马上进入接收剩余数据的等待
{
Time20msCnt=0;
while(Time20msCnt<5) //根据要接收的数据多少和波特率,确定大概的等待时间
{
if((Data_Buffer[0]==0x12)&&(Data_Buffer[1]==0x21)){ //收到固定的指令数据0x12 0x21后,
//给指令标志ack赋特定的值 并且马上结束等待
ack=1;
Data_Buffer[0]=0;
Data_Buffer[1]=0;
break;
}
if(Data_Buffer[0]==0x30&Data_Buffer[1]==0x31){
ack=2;
Data_Buffer[0]=0;
Data_Buffer[1]=0;
break;
}
}
Receiver_Count=0;
}
}
}
void UARTInterrupt(void) interrupt 4 //串口中断
{
if(RI)
{
if(Receiver_Count<5)
{
Data_Buffer[Receiver_Count++]=SBUF;
}
RI = 0;
}
else return;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
//给指令标志ack赋特定的值 并且马上结束等待
ack=1;
SendOneBiyt(0xce); //测试用
Data_Buffer[0]=0;
Data_Buffer[1]=0;
break;
}
有个疑问就是 如果把这段程序改成这样:
if((Data_Buffer[0]==0x12)&&(Data_Buffer[1]==0x21)){ //收到固定的指令数据0x12 0x21后,
//给指令标志ack赋特定的值 并且马上结束等待
ack=1;
SendOneBiyt(0xce); //测试用
break;
}
侧响应速度没那么快了,如果有Data_Buffer[0]=0; Data_Buffer[1]=0; 侧至少以5MS的间隔给单片机发送16进制0x12、0x21单片机都能响应,并返回0xce,但如果没有Data_Buffer[0]=0; Data_Buffer[1]=0; 侧响应速度连10MS达不到,不知道怎么回事呢???
-----------------------------------------------------------------------
你说是在中断里面判断吗??
-----------------------------------------------------------------------
是啊,其实完全可以在中断里判断是否是一帧有用的数据,有就置标志
-----------------------------------------------------------------------
呵呵这要看你的协议怎么样了,里面要是有帧命令对应一定帧长度,加上校验字和结束符,这样就能判断完整的一帧了
一周热门 更多>