求助,十六进制数据收发写完了,问题还是没按我的要求来

2020-01-17 19:10发布

#include        <reg51.h>
#define                uch        unsigned char
#define                uint        unsigned int
/*=========================================*/

bit        com_over;
bit        com_ok;
bit  T;

uch        data        com_buf[30];
uch        data        com_num=0;
uch data        send_num=0;
uch        data        com_delay;
uch data        temp[5];


void        System_init(void)       
{
        TMOD=0x21;
        SCON=0x70;//SM0=0,SM1=1,SM2=1,REN=1,TB8=0,RB8=0,TI=0,RI=0
        PCON=0x80;//波特率加倍
        TH0=0xb8;//for 11.0592 定时10MS
        TL0=0x00;
        P1 = 0X00;
        TH1=TL1=0xfa; // 9600        for 11.0592


        TR0=1;
        TR1=1;
        ET0=1;
        REN=1;
        ES=1;
        EA=1;
        com_over=0;
        com_delay=0;
        com_num=0;
}

void        main(void)
{       
        System_init();
       
       
       
        while(1)
        {        if(com_ok)
                {       
                        ES=0;
                        com_ok=0;//表明串口接受数据成功,这里先清标读
                        //这里可以加一些需要处理的子程序

                       
                       
                        //下面可以对收到的数据进行处理,这里收到的数据会通过串口发送出去,
//==================================================================================
                        //这里发送数据采用查询方式来做,
                        send_num=0;
                        do
                        {
                                temp[0]=com_buf[send_num];
                                SBUF=com_buf[send_num];//SBUF赋值后,会自动进入中断去判断有没有发送成功,
                                while(!TI);//通过TI是不是1来判断
                        TI=0;
                        send_num++;
                        }while(temp[0]!=0x0d);
                        REN=1;
                      ES=1;                       
//==================================================================================
/*                        //这里发送数据采用中断方式来做,
                        send_num=0;       
                        ES=1;        //开启串口中断               
                        SBUF=com_buf[send_num];//SBUF赋值后,会自动进入中断去判断有没有发送成功,
*/
//==================================================================================
       
                }
        }         
}       

void        timer0() interrupt 1 //定时器0中断
{

        TH0=0xb8;        //10ms,11.0592MHz
        TL0=0x00;
       
        if(com_over)
        {        com_delay++;
                if(com_delay>=3)
                {        com_delay=0x00;
                        com_over=0;
                        com_num=0;
                }
        }
}               

void        serial0() interrupt 4
{       
        if(RI)
        {        RI=0;//表示收到数据,这里先清RI
                com_over=1;com_delay=0;//开启通信超时
                com_buf[com_num]=SBUF;//把收到数据放进数组里
                if(com_buf[com_num]==0x0d) //判断是不是收到最后一个数据
                {        com_over=0;com_delay=0;//串口数据已经收完,关闭通信超时
                        com_num=0;
                        REN=0;//关闭串口接受,到主程序里面判断是否还要重新打开
                        if(com_buf[0] == 0x32)
                        {
                                if(com_buf[1] == 0x32)
                                {
                                        if(com_buf[2] == 0x39)
                                        {
                                                if(com_buf[3] == 0x36)
                                                {
                                                        if(com_buf[4] == 0x39)
                                                        {
                                                                P1 = 0xff;
                                                        }
                                                }
                                        }
                                }
                        }
                        com_ok=1;//置数据接受标志
                }
                else
                        com_num++;//不是最后一个数据,+1,方便接收下一个数据

        }               
        else if(TI)
        {        TI=0;//表示数据已经发送成功,这里先清TI
               
                if(com_buf[send_num]==0x0d) //数据是不是最后一个字节
                {        send_num=0;REN=1;//发送数据完成,开启串口接收
                }
                else
                {        send_num++;//不是最后一个字节,继续发送数据
                        SBUF=com_buf[send_num];       
                }
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。