搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2014-11-29 14:51:32 | 显示全部楼层 |阅读模式
本帖最后由 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;
                                                                                                                                                                                                 ////////
                        }                                                                                                                                                                                 ////////
                }                                                                                                                                                                                          ////////
        }                                                                                                                                                                 ////////
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-11-29 15:31:19 | 显示全部楼层
帮顶。没这么弄过。

出0入0汤圆

发表于 2014-12-2 18:51:09 | 显示全部楼层
看懂一部分。。。

出0入0汤圆

 楼主| 发表于 2014-12-24 16:24:19 | 显示全部楼层
Savent 发表于 2014-12-2 18:51
看懂一部分。。。

   暂时 放下了!先不搞了!有其他的“任务”了!呵呵
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表