[51单片机] 关于串口的问题

[复制链接]
1628|7
 楼主| happywei 发表于 2014-5-8 22:25 | 显示全部楼层 |阅读模式
本帖最后由 happywei 于 2014-5-9 09:40 编辑

求教高手我向51单片机发送数据,就会返回数据,当接受1b 25 41,或1b 25 42,1b 25 43或1b 25 4b命令时就不转发,且执行相应的操作,我现在遇到的问题是当发1b 25 41时,会返回1b 25,按要求应该是要不返回数据
程序如下,求高手指点

void serial() interrupt 4
{
        RI=0;                  //清除接收中断
    RecTmp = SBUF ;

    switch (CMD_state)
        {
    case 0:
        if(RecTmp == 0x1b) {
        // maybe CMD!
            CMD_state = 1 ;
            CMD_flag1=1;
            flag=1;                                                                        
        }
                else
                {
                        flag=0;
                        CMD_flag1=0;
                                    CMD_state = 0 ;
                        }
        break ;

    case 1:
        if (RecTmp == 0x25)
                {
                        flag=1;
            CMD_state = 2 ;
                        CMD_flag2=1;
        }
                else
                {        
                        flag=0;
                        CMD_flag1=0;
                        CMD_flag2=0;
            CMD_state = 0 ;
        }
        break ;

    case 2:
        CMD3 = RecTmp ;
        switch(CMD3)
                        {
            case 0x41:
            case 0x42:
            case 0x43:
            case 0x4b:
                CMD_flag3 = 1 ;
                 CMD_flag = 1 ;
                flag=1;                        
            break;
            default:
                  flag=0;
                   CMD_flag1=0;
                   CMD_flag2=0;
                   CMD_flag3 = 0 ;
                   CMD_state = 0 ;
            break;
                }
                  
        break ;
    }
        if(flag==1)
        {
         flag_aa=1;
                 if(CMD_flag3 == 1)
                 {
                  flag=0;
           CMD_flag1=0;
           CMD_flag2=0;
           CMD_flag3 = 0 ;
           CMD_state = 0 ;
                   flag_aa=0;
                 }
                 else
                 {
                        table[Rx_i] = RecTmp ;
                        Rx_i ++ ;
                        if(Rx_i  == table_size)
                        Rx_i  = 0 ; // 到table结尾了,从头0再来
                                                flag_aa=0;
                 }      
        }
        else
        {
                if(flag_aa==0)
                {
                                    if( (Rx_i + 1)  == Tx_i)
                        {
                    //满
                            }
                        else
                        {
                        table[Rx_i] = RecTmp ;
                        Rx_i ++ ;
                        if(Rx_i  == table_size)
                                Rx_i  = 0 ; // 到table结尾了,从头0再来                 
                   
                        }
                        }
                }
}
 楼主| happywei 发表于 2014-5-8 22:27 | 显示全部楼层
谢谢啦
wangch_sh 发表于 2014-5-9 08:19 | 显示全部楼层
程序太长,没仔细看。你看看,你发送1b,25时,程序是怎么处理的?
 楼主| happywei 发表于 2014-5-9 08:40 | 显示全部楼层
wangch_sh 发表于 2014-5-9 08:19
程序太长,没仔细看。你看看,你发送1b,25时,程序是怎么处理的?

我就是在串口中断那里处理的,只看那里就行了
ningling_21 发表于 2014-5-9 08:58 | 显示全部楼层
happywei 发表于 2014-5-9 08:40
我就是在串口中断那里处理的,只看那里就行了

好乱,还不如贴出流程图...
 楼主| happywei 发表于 2014-5-9 09:42 | 显示全部楼层
ningling_21 发表于 2014-5-9 08:58
好乱,还不如贴出流程图...

就是在这里怎么去判断
if(flag==1)
        {
         flag_aa=1;
                 if(CMD_flag3 == 1)
                 {
                  flag=0;
           CMD_flag1=0;
           CMD_flag2=0;
           CMD_flag3 = 0 ;
           CMD_state = 0 ;
                   flag_aa=0;
                 }
                 else
                 {
                        table[Rx_i] = RecTmp ;
                        Rx_i ++ ;
                        if(Rx_i  == table_size)
                        Rx_i  = 0 ; // 到table结尾了,从头0再来
                                                flag_aa=0;
                 }      
        }
不知怎么判断了,先谢谢大侠们了
ningling_21 发表于 2014-5-9 10:10 | 显示全部楼层
if(RI==1)
{
   RI=0;
   table[Rx_i] = SBUF;
   Rx_i ++ ;
   if(Rx_i >=3)    //收到一帧,可以处理
{
    //标志写1;
     .....
}
}

数据处理,可以放在主程序中
 楼主| happywei 发表于 2014-5-9 10:51 | 显示全部楼层
ningling_21 发表于 2014-5-9 10:10
if(RI==1)
{
   RI=0;

需要判断是不是1b 25 41,或1b 25 42,1b 25 43或1b 25 4b命令,而且随时都可能是
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部