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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
回复【18楼】trent5145
协议一般情况下是[帧头][id][功能][数据长度][若干数据][校验][帧尾]
中断里判断帧头,id,功能,长度就可以了,另外收到帧尾和校验通过都要把相应的标志置位,其他的事情就在主程序处理
-----------------------------------------------------------------------
您说的够清楚了,可能是我比较笨,这句话明白了“中断里判断帧头,id,功能,长度就可以了”,下半句还是没明白“另外收到帧尾和校验通过都要把相应的标志置位”,把相应标志置位是在中断里面完成吗?还是在主程序中完成?
-----------------------------------------------------------------------
为了确保接收的帧都是正确且完整的,每个人的方法都不同,总的原则是中断里的程序尽量想办法精简,比如收到帧尾了和校验位通过了可以让接收成功的标志位置位,然后在主程序里判断标志位后接着处理这一个正确且完整的数据帧
一周热门 更多>