请教各位51单片机串口通讯的问题

2020-01-21 21:34发布

本帖最后由 bihan163 于 2014-11-29 14:53 编辑

想请教各位我现在做的程序 我用STC89单片机写的程序T0作为定时器用(上电就工作,这个定时器要控制一个IO口的高低转换,时间可调)、T1作为计数器配合定时器0计算外部输入的频率(并且显示在数码管上)、定时器2作为波特率发生器(串口通讯);现在想在现有的程序上改动,模仿modbus,实现一个主机(迪文modbus屏)与多个从机(STC89)通讯,主机不断的循环读取从机的数据(时间、频率等),现在我改的程序开始的时候能通讯正常,但是过段时间或者修改单片机内部分参数单片机就不往外发送数据了!感觉是串口通讯出了问题。想问下我这个程序还怎么加接收数据超时?或者接受数据的地方该如何改呢?我的程序比较乱(程序都是从上写到下),只把一部分我觉得有问题的程序贴出来,大家帮忙给点建议。

//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////向触摸屏发送数据和指令//////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
                                                                                                                                                         /////////////////
                                                                                                                                                         /////////////////
/*****************************************************                                                 /////////////////
函数功能:向上位机发送数据包(数据)                                                                                 /////////////////
入口参数:uint Addr(地址), uint Dat(数据)                                                                 /////////////////
                                                                                                                                                         /////////////////
                                                                                                                                                         /////////////////
***************************************************/                                                  /////////////////
void SendData_xie(uchar Comm, uint Dat)//SendData(0x04, gongzuo);                                 /////////////////
{                                                                                                                                                         /////////////////
        uchar i;                                                                                                                                 /////////////////
    table_data[0]=(uchar)ID_cong;                                                                                                 /////////////////
    table_data[1]=(uchar)Comm;                                                                                            /////////////////
        table_data[2]=(uchar)0x02;//读取字节数                                                                                                 /////////////////
    table_data[3]=(uchar)(Dat>>8);                                                                                                 /////////////////
        table_data[4]=(uchar)(0x00ff&Dat);
        crc = GetCRC16(table_data, 5); //计算CRC校验值
        crch = crc >> 8;//CRC校验高八位
        crcl = crc & 0xFF;//CRC校验低八位                                                                                         /////////////////
    table_data[5]=crch;                                                                            /////////////////
        table_data[6]=crcl;
        //delayX10us(1);                                                                                         /////////////////                                                                                 /////////////////
    for (i=0;i<7;i++)                                                                                                                 /////////////////
        {                                                                                                                                                 /////////////////
                ES=0;                                                                                                                                 /////////////////
                SBUF=table_data;                                                                                                         /////////////////
                while(!TI);                                                                                                                         /////////////////
                TI=0;                                                                                                                                 /////////////////
                ES=1;                                                                                                                                 /////////////////
        }                                                                                                                                                 /////////////////
}                                                                                                                                                         /////////////////

void chuli_uart()//在主函数处理
{
        if(RXFRMOK==1)
        {
                crc = GetCRC16(RXBUF, 6); //计算CRC校验值
                crch = crc >> 8;//CRC校验高八位
            crcl = crc & 0xFF;//CRC校验低八位
                if((RXBUF[6]==crch)&(RXBUF[7]==crcl ))
                {
                        if(RXBUF[1]==0x03)
                        {       
                                if((RXBUF[3]==0x01)&(RXBUF[5]==0x01))//上位机读取工作周期
                                {
                                        SendData_xie(0x03,zhouqi);       
                                }
                                if((RXBUF[3]==0x02)&(RXBUF[5]==0x01))//上位机读取工作时间
                                {
                                        SendData_xie(0x03,gongzuo);
                                }
                                if((RXBUF[3]==0x03)&(RXBUF[5]==0x01))//上位机读取停止时间
                                {
                                        SendData_xie(0x03,tingzhi);
                                }
                                if((RXBUF[3]==0x04)&(RXBUF[5]==0x01))//上位机读取工作频率
                                {
                                        SendData_xie(0x03,plv);
                                }
                                if((RXBUF[3]==0x05)&(RXBUF[5]==0x01))//上位机读取功率
                                {
                                        SendData_xie(0x03,glv);
                                }               
                        }
                        if(RXBUF[1]==0x06)
                        {
                                if((RXBUF[2]==0x00)&(RXBUF[3]==0x01))//上位机写工作周期
                                {
                               
                                        zhouqi=RXBUF[4]*256+RXBUF[5];
                                        t5=zhouqi;
                                        savezhouqi_stc();
                                        SendData_du(0x01,zhouqi);       
                                }
                                if((RXBUF[2]==0x00)&(RXBUF[3]==0x02))//上位机写工作时间
                                {
                                        gongzuo=RXBUF[4]*256+RXBUF[5];
                                        t2=gongzuo;
                                        readgongzuo_stc();
                                        SendData_du(0x02,gongzuo);
                                }
                                if((RXBUF[2]==0x00)&(RXBUF[3]==0x03))//上位机写停止时间
                                {
                                        tingzhi=RXBUF[4]*256+RXBUF[5];
                                        t3=tingzhi;
                                        savetingzhi_stc();
                                        SendData_du(0x03,tingzhi);
                                }
                               
                               
                                if((RXBUF[2]==0x00)&(RXBUF[3]==0x04))//上位机写工作频率
                                {
                                        if(RXBUF[5]==0x01)//01为加频率
                                        {
                                                h++;
                                                if(h==201)
                                                {
                                                        h=200;
                                                }
                                                savepinlv_stc();                                               
                                                DA_PL(h*4);
                                                SendData_du(0x04,0x0001);       
                                        }
                                        if(RXBUF[5]==0x02)//02为减频率
                                        {
                                                h--;
                                                if(h==0)
                                                {
                                                        h=1;
                                                }
                                                savepinlv_stc();                                               
                                                DA_PL(h*4);
                                                SendData_du(0x04,0x0002);       
                                        }
                                       
                                }
               
               
                                if((RXBUF[2]==0x00)&(RXBUF[3]==0x05)&(RXBUF[5]==0x00))//上位机写功率
                                {
                                                i++;
                                                if(i==9)
                                                {
                                                        i=8;
                                                }                                               
                                                SendData_du(0x05,0x0000);
                                                gonglv();
                                                write_add(3,i);
                                                DA_GL(675+40*i);
                                }       
                                if((RXBUF[2]==0x00)&(RXBUF[3]==0x06)&(RXBUF[5]==0x00))//02为减功率
                                {
                                        i--;
                                        if(i==0)
                                        {
                                                i=1;
                                        }                                       
                                        SendData_du(0x06,0x0000);       
                                        gonglv();
                                        write_add(3,i);
                                        DA_GL(675+40*i);
                                }
                        }
                }
                for (i=0;i<8;i++)                                                                                                                 /////////////////
                {                                                                                                                                                 /////////////////                                                                                                                                                                 /////////////////
                        RXBUF=0;                                                                                                         /////////////////                                                                                                                                 /////////////////
                }
                }
                Rx_P=0;                       
                RXFRMOK=0;                                                       
}

void UART1_ISR() interrupt 4//串口通讯                                                                                                                   ////////
{                                                                                                                                                                                                         ////////
        unsigned char i;                                                                                                                                                                                    ////////
        if(RI)     //串口接收中断                                                                                                                                                  ////////
        {                                                                                                                                                                                            ////////
                i=SBUF;                                                                                                                                                                          ////////
                RI=0;                                                                                                                                                                        ////////
                if(RXFRMOK==0)  //如果 RXFRMOK=1 表示前台程序未处理完当前数据,丢弃                                                  ////////
                {                                                                                                                                                                                          ////////
                        if(RXIDOK)      //接收到 0x5A                                                                                                                          ////////
                        {                                                                                                                                                                                 ////////
                                RXBUF[Rx_P]=i;
                                Rx_P++;
                                if((RXBUF[1]==0x03)|(RXBUF[1]==0x06))
                                {   
                                                if((RXBUF[2]==0x00)&(RXBUF[4]==0x00))
                                                {
                                                        if(Rx_P>=8)
                                                        {         
                                                                        RXFRMOK=1;                                                                                                                                                  ////////
                                                                        RXIDOK=0;
                                                                        Rx_P=0;               
                                                        }
                                                }
                                                else if((RXBUF[2]!=0x00)|(RXBUF[4]!=0x00))
                                                {
                                                         Rx_P=0;
                                                        RXIDOK=0;
                                                }
                                }
                                else if((RXBUF[1]!=0x03)&(RXBUF[1]!=0x06))
                                {
                                        Rx_P=0;
                                        RXIDOK=0;
                                }                                                                                                                                                                 ////////
                        }                                                                                                                                                                                  ////////
                        if(!RXIDOK&&(i==ID_cong))                                                                                                                                   ////////
                        {                                                                                                                                                                                   ////////
                                RXBUF[0]=i;
                                RXIDOK=1;                                                                                                                                                           ////////
                                Rx_P=1;
                                                                                                                                                                                                 ////////
                        }                                                                                                                                                                                 ////////
                }                                                                                                                                                                                          ////////
        }                                                                                                                                                                 ////////
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。