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

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条回答
jdzjk06
1楼-- · 2020-01-27 16:33
回复【11楼】huayuliang 花生
楼主没弄过协议。。
-----------------------------------------------------------------------

没弄过协议,望指教啊!!!
jdzjk06
2楼-- · 2020-01-27 17:39
 精彩回答 2  元偷偷看……
trent5145
3楼-- · 2020-01-27 19:25
回复【20楼】jdzjk06
回复【18楼】trent5145  
协议一般情况下是[帧头][id][功能][数据长度][若干数据][校验][帧尾]  
中断里判断帧头,id,功能,长度就可以了,另外收到帧尾和校验通过都要把相应的标志置位,其他的事情就在主程序处理
-----------------------------------------------------------------------
您说的够清楚了,可能是我比较笨,这句话明白了“中断里判断帧头,id,功能,长度就可以了”,下半句还是没明白“另外收到帧尾和校验通过都要把相应的标志置位”,把相应标志置位是在中断里面完成吗?还是在主程序中完成?
-----------------------------------------------------------------------

为了确保接收的帧都是正确且完整的,每个人的方法都不同,总的原则是中断里的程序尽量想办法精简,比如收到帧尾了和校验位通过了可以让接收成功的标志位置位,然后在主程序里判断标志位后接着处理这一个正确且完整的数据帧
huayuliang
4楼-- · 2020-01-27 23:21
回复【20楼】jdzjk06  
-----------------------------------------------------------------------

接收尽量在中断中完成,这样时间利用率比较高。

简单说吧,你一般都会定义一个全局数组变量吧?和一个下标变量x。还需要几个变量为你的协议用,比如长度...再用一个数组保存内容数据。

假定数组 ary[n字节]
假定帧头 2 字节,分别为 0x55 0xAA(哦,这是俺常用的),那么一旦收到第一个字节为 0x55,就可以开始判断了:
ary[x] = 缓冲
if (ary[0]!==0x55)
    return;
if (ary[1]!=0xAA)
    return;
id = ary[2]
len = ary[?]
再根据长度依次取内容数据放到另一个数组里,由主程序处理它(如果功能简单,在中断里处理也可以)。。。
收完校验字节后,计算比较。。。
最后判断帧尾,虽然用途不大,不过可以表明数据是否接收完毕以及通讯是否完整。
俺一般是把 功能(用途)字节和数据放在一起。
afei_sh
5楼-- · 2020-01-28 01:51
回复【21楼】trent5145
-----------------------------------------------------------------------

同意。
中断程序尽量简短,否则会影响其他中断的响应速度,从而影响实时性。
jdzjk06
6楼-- · 2020-01-28 01:56
非常感谢楼上两位的指教!!谢了!!!

一周热门 更多>