小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 7172|回复: 5

用15单片机写的串口通信的程序,串口中断部分的代码,老不对

[复制链接]
发表于 2015-5-28 10:51:38 | 显示全部楼层 |阅读模式
检测串口数据的代码总是不对,大家帮忙看看呗,看哪里错了、谢谢了
void receive() interrupt 4
{
       
        if(RI)
        {
                RI = 0;
       
                RX1_Buffer[RX1_Cnt]  = SBUF;                //保存一个字节

                if(RX1_Buffer[0]==0xFF)
                  {
                        RX1_Cnt++;
                  }
                else
                {
                        RX1_Cnt=0;
                }
                if(RX1_Buffer[1]==0x00)
                  {
                        RX1_Cnt++;
                  }
                else
                {
                        RX1_Cnt=0;
                }


                switch(RX1_Buffer[0])
    {
          case 0xFF:
                          switch(RX1_Buffer[1])
                          {
                                case   0x00:
                                          switch(RX1_Buffer[3])
                                                  {
                                                case  0x00:
                                                        switch(RX1_Buffer[4])
                                                           {
                                                                   case 0xFF:
                                                                                   switch(RX1_Buffer[2])
                                                                                {
                                                                                        case 0x01:                  flag_forward=1; break;
                                                                                        case 0x02:                  flag_backward=1; break;
                                                                                        case 0x03:                flag_left=1;break;
                                                                                        case 0x04:      flag_right=1;break;
                                                                                         default:  RX1_Cnt=0;
                                                                                }
                                                                        ;break;       
                                                                }
                                                                ;break;       
                                                }
                                                ;break;       
                                }
                                ;break;          default:    RX1_Cnt=0;
        }
//                RX1_Cnt=0;
//        }
//       
//                if(RX1_Cnt>=8)
//                {
//                        if(RX1_Buffer[0]==0xFF && RX1_Buffer[1]==0x00 && RX1_Buffer[3]==0x00 && RX1_Buffer[4]==0xFF)
//                        {
//                                        if( RX1_Buffer[2]==0x01)
//                                                                        flag_forward=1;
//                        else               
//                                        if( RX1_Buffer[2]==0x02)
//                                                                        flag_backward=1;
//                        else       
//                                        if( RX1_Buffer[2]==0x03)
//                                                                        flag_left=1;
//                        else               
//                                        if( RX1_Buffer[2]==0x04)
//                                                                        flag_right=1;
//                        }
//                          RX1_Cnt=0;
//                }
//                 else          
//                         {
//                                RX1_Cnt=0;
//                        }
//                        RX1_Cnt=0;
        }
        if(TI)
          {
                TI = 0;
                B_TX1_Busy = 0;                //清除发送忙标志
          }
}

回复

使用道具 举报

 楼主| 发表于 2015-5-30 12:40:58 | 显示全部楼层
heganghongyan 发表于 2015-5-29 18:47
.................这么麻烦啊……。写的简单点行不。是我看不懂哈哈

我已经解决了,用了另一种思路来写,用了 三个标志位,贴给大家参考参考吧
void receive() interrupt 4
{
       
        if(RI)
        {
                RI = 0;
                if(temp3 == 1)                                //包头包尾都正确 ,检测数据位
                {
                        switch(RX1_Test[2])
                        {
                                case 0x01:                  flag_forward=1; temp1=temp2 =temp3= 0;break;
                                case 0x02:                  flag_backward=1; temp1=temp2 =temp3= 0;break;
                                case 0x03:                flag_left=1;temp1=temp2 =temp3= 0;break;
                                case 0x04:      flag_right=1;temp1=temp2 =temp3= 0;break;
                                case 0x00:      flag_stop=1;temp1=temp2 =temp3= 0;break;
                                default: temp1=temp2 =temp3= 0;break;
                        }
                        temp1=temp2 =temp3= 0;
                }
                else
                if(temp2 == 1)                                                   //        包尾检测
                {
                RX1_Test[4] =  RX1_Test[3];
                RX1_Test[3]        =  SBUF;
                        if(RX1_Test[3]==0xff  &&  RX1_Test[4]==0x00)
                        {
                                          temp3 = 1;
                       
                        }
                }

                else  
                 if(temp1 == 1)           //检测到包头送第三个字节,置tempt2为1,开始检测包尾
                {
                          RX1_Test[2] = SBUF;
                          temp2 = 1;
                           
                }
                else
               
                if(temp1 == 0)                   //检测包头
                {
                        RX1_Test[1] =  RX1_Test[0];
                        RX1_Test[0]        =  SBUF;
                        if(RX1_Test[0]==0x00  &&  RX1_Test[1]==0xff)
                        {
                                            temp1  =  1;       
                                       
                        }
               
                }
                  
        }
//        if(TI)
//          {
//                TI = 0;
//                B_TX1_Busy = 0;                //清除发送忙标志
//          }
}

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2015-5-28 10:52:58 | 显示全部楼层
我esp8266来给它传数据,但是前面有很多的无用包,需要检测到0xFF再开始计数。
回复 支持 反对

使用道具 举报

发表于 2015-5-29 18:47:17 | 显示全部楼层
.................这么麻烦啊……。写的简单点行不。是我看不懂哈哈
回复 支持 反对

使用道具 举报

发表于 2015-6-4 08:07:05 | 显示全部楼层
学习了 ,正需要这些,多谢楼主
回复 支持 反对

使用道具 举报

发表于 2015-12-30 14:41:48 | 显示全部楼层
小白路过学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-23 00:02 , Processed in 1.120652 second(s), 24 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表