bihan163 发表于 2014-11-29 14:51:32

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

本帖最后由 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=(uchar)ID_cong;                                                                                               /////////////////
    table_data=(uchar)Comm;                                                                                          /////////////////
        table_data=(uchar)0x02;//读取字节数                                                                                               /////////////////
    table_data=(uchar)(Dat>>8);                                                                                               /////////////////
        table_data=(uchar)(0x00ff&Dat);
        crc = GetCRC16(table_data, 5); //计算CRC校验值
        crch = crc >> 8;//CRC校验高八位
        crcl = crc & 0xFF;//CRC校验低八位                                                                                       /////////////////
    table_data=crch;                                                                          /////////////////
        table_data=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==crch)&(RXBUF==crcl ))
                {
                        if(RXBUF==0x03)
                        {       
                                if((RXBUF==0x01)&(RXBUF==0x01))//上位机读取工作周期
                                {
                                        SendData_xie(0x03,zhouqi);       
                                }
                                if((RXBUF==0x02)&(RXBUF==0x01))//上位机读取工作时间
                                {
                                        SendData_xie(0x03,gongzuo);
                                }
                                if((RXBUF==0x03)&(RXBUF==0x01))//上位机读取停止时间
                                {
                                        SendData_xie(0x03,tingzhi);
                                }
                                if((RXBUF==0x04)&(RXBUF==0x01))//上位机读取工作频率
                                {
                                        SendData_xie(0x03,plv);
                                }
                                if((RXBUF==0x05)&(RXBUF==0x01))//上位机读取功率
                                {
                                        SendData_xie(0x03,glv);
                                }               
                        }
                        if(RXBUF==0x06)
                        {
                                if((RXBUF==0x00)&(RXBUF==0x01))//上位机写工作周期
                                {
                               
                                        zhouqi=RXBUF*256+RXBUF;
                                        t5=zhouqi;
                                        savezhouqi_stc();
                                        SendData_du(0x01,zhouqi);       
                                }
                                if((RXBUF==0x00)&(RXBUF==0x02))//上位机写工作时间
                                {
                                        gongzuo=RXBUF*256+RXBUF;
                                        t2=gongzuo;
                                        readgongzuo_stc();
                                        SendData_du(0x02,gongzuo);
                                }
                                if((RXBUF==0x00)&(RXBUF==0x03))//上位机写停止时间
                                {
                                        tingzhi=RXBUF*256+RXBUF;
                                        t3=tingzhi;
                                        savetingzhi_stc();
                                        SendData_du(0x03,tingzhi);
                                }
                               
                               
                                if((RXBUF==0x00)&(RXBUF==0x04))//上位机写工作频率
                                {
                                        if(RXBUF==0x01)//01为加频率
                                        {
                                                h++;
                                                if(h==201)
                                                {
                                                        h=200;
                                                }
                                                savepinlv_stc();                                               
                                                DA_PL(h*4);
                                                SendData_du(0x04,0x0001);       
                                        }
                                        if(RXBUF==0x02)//02为减频率
                                        {
                                                h--;
                                                if(h==0)
                                                {
                                                        h=1;
                                                }
                                                savepinlv_stc();                                               
                                                DA_PL(h*4);
                                                SendData_du(0x04,0x0002);       
                                        }
                                       
                                }
               
               
                                if((RXBUF==0x00)&(RXBUF==0x05)&(RXBUF==0x00))//上位机写功率
                                {
                                                i++;
                                                if(i==9)
                                                {
                                                        i=8;
                                                }                                               
                                                SendData_du(0x05,0x0000);
                                                gonglv();
                                                write_add(3,i);
                                                DA_GL(675+40*i);
                                }       
                                if((RXBUF==0x00)&(RXBUF==0x06)&(RXBUF==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=i;
                                Rx_P++;
                                if((RXBUF==0x03)|(RXBUF==0x06))
                                {   
                                                if((RXBUF==0x00)&(RXBUF==0x00))
                                                {
                                                        if(Rx_P>=8)
                                                        {       
                                                                        RXFRMOK=1;                                                                                                                                                ////////
                                                                        RXIDOK=0;
                                                                        Rx_P=0;               
                                                        }
                                                }
                                                else if((RXBUF!=0x00)|(RXBUF!=0x00))
                                                {
                                                       Rx_P=0;
                                                        RXIDOK=0;
                                                }
                                }
                                else if((RXBUF!=0x03)&(RXBUF!=0x06))
                                {
                                        Rx_P=0;
                                        RXIDOK=0;
                                }                                                                                                                                                               ////////
                        }                                                                                                                                                                                ////////
                        if(!RXIDOK&&(i==ID_cong))                                                                                                                               ////////
                        {                                                                                                                                                                               ////////
                                RXBUF=i;
                                RXIDOK=1;                                                                                                                                                       ////////
                                Rx_P=1;
                                                                                                                                                                                               ////////
                        }                                                                                                                                                                               ////////
                }                                                                                                                                                                                        ////////
        }                                                                                                                                                               ////////
}

彼岸花开@ 发表于 2014-11-29 15:31:19

帮顶。没这么弄过。

Savent 发表于 2014-12-2 18:51:09

看懂一部分。。。

bihan163 发表于 2014-12-24 16:24:19

Savent 发表于 2014-12-2 18:51
看懂一部分。。。

{:sweat:}   暂时 放下了!先不搞了!有其他的“任务”了!呵呵
页: [1]
查看完整版本: 请教各位51单片机串口通讯的问题