打印
[51单片机]

关于串口的问题

[复制链接]
1117|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时,程序是怎么处理的?

我就是在串口中断那里处理的,只看那里就行了

使用特权

评论回复
5
ningling_21| | 2014-5-9 08:58 | 只看该作者
happywei 发表于 2014-5-9 08:40
我就是在串口中断那里处理的,只看那里就行了

好乱,还不如贴出流程图...

使用特权

评论回复
6
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;
                 }      
        }
不知怎么判断了,先谢谢大侠们了

使用特权

评论回复
7
ningling_21| | 2014-5-9 10:10 | 只看该作者
if(RI==1)
{
   RI=0;
   table[Rx_i] = SBUF;
   Rx_i ++ ;
   if(Rx_i >=3)    //收到一帧,可以处理
{
    //标志写1;
     .....
}
}

数据处理,可以放在主程序中

使用特权

评论回复
8
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

粉丝