菜鸟发一个自认为不错的串口接收指令的程序!!严重欢迎拍砖、指教!!!

2020-01-25 15:32发布

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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
37条回答
zhanglu1990
1楼-- · 2020-01-25 19:43
应该先判断帧头后再存数组要好点吧
jdzjk06
2楼-- · 2020-01-25 21:05
if((Data_Buffer[0]==0x12)&&(Data_Buffer[1]==0x21)){      //收到固定的指令数据0x12 0x21后,
                                                                                               //给指令标志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达不到,不知道怎么回事呢???
jdzjk06
3楼-- · 2020-01-25 21:49
回复【1楼】zhanglu1990 杨工
-----------------------------------------------------------------------

你说是在中断里面判断吗??
zhanglu1990
4楼-- · 2020-01-25 23:01
回复【3楼】jdzjk06
-----------------------------------------------------------------------

是啊,其实完全可以在中断里判断是否是一帧有用的数据,有就置标志
jdzjk06
5楼-- · 2020-01-26 04:09
 精彩回答 2  元偷偷看……
zhanglu1990
6楼-- · 2020-01-26 08:45
回复【5楼】jdzjk06
-----------------------------------------------------------------------

呵呵这要看你的协议怎么样了,里面要是有帧命令对应一定帧长度,加上校验字和结束符,这样就能判断完整的一帧了

一周热门 更多>