找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4726|回复: 13
收起左侧

51单片机通信问题(接收七个八位数据正常,一但接收六个八位数据,就陷入死循环)

[复制链接]
ID:77695 发表于 2015-4-22 10:32 | 显示全部楼层 |阅读模式
void com_init(void);

void main(void)
{               
               
                 
     uchar com_dat;
     com_init();                                                                                                                                                                                                                    
     while(1)
     {
                                         
          if(RI)
          {
            com_dat=SBUF;
            RI=0;                                                
                                                table[ i]=com_dat;
                                                SBUF=com_dat;
                                          TI=0;
                                                i++;
                                                if(i>6)
                                                {
                                                        disp_data();
                                                        i=0;
                                                }
          }
                                                
     }
}
void disp_data()//ò»′Î′|àí
{
                        if(table[0]==0xAA)
                        {
                                if(table[1]==0xBB)
                                {
                                        if(table[2]==0x01)
                                                //if(table[5]==0x00)
                                                //if(table[6]==0xFF)
                                        {
                                                P0=table[3];
                                                P1=table[4];
                                        }
                                }                                
                        }                        
}

void com_init(void)
{
    TMOD=0X20;
                SCON=0X50;
                TH1=0XFD;
                TL1=0XFD;
                ET0=1;
                EA=1;               
                TR1=1;
                P0=0;
                P1=0;        
}

这是我的程序,默认协议为 AA BB  address data1 data2 00 FF,接收七个八位数据正常,一但接收六个八位数据,比如 AA BB 01 3f 00 FF ,程序就陷入死循环了,大家帮帮忙帮我解决下怎么处理像六个八位数据的情况啊,谢谢

回复

使用道具 举报

ID:72643 发表于 2015-4-22 10:55 | 显示全部楼层
if((table[0]==0xAA)&&(table[1]==0xBB)&&(table[2]==0x01)&&(table[5]==0x00)&&(table[6]==0xFF))
{ P0=table[3];P1=table[4];}
else{P0=0;P1=0;}你试试吧
                       

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:77695 发表于 2015-4-22 11:29 | 显示全部楼层
superjiangzhen 发表于 2015-4-22 10:55
if((table[0]==0xAA)&&(table[1]==0xBB)&&(table[2]==0x01)&&(table[5]==0x00)&&(table[6]==0xFF))
{ P0=t ...

这样当然是可以的 ,我也试过了, 但是不是我想要的结果,我的目的是发射端发送AA BB 01 3F 00 FF的时候,单片机能检测出来时错的,如果发射端发下一条正确的指令,单片机能正常运行。像您刚才说的那种情况,我试过,发射端发送完错误指令,在发送正确指令,单片机就完全没有反应了,死那了
回复

使用道具 举报

ID:72643 发表于 2015-4-22 12:46 | 显示全部楼层
我估计你这不是进入死循环 你这里面就没有进入死循环的可能 你程序里有个判断 发送完7个8位数才进入disp_data()里,所以你发送6个数时,再发送7个数 此时的i=6;还是进不了disp_data()里,我觉得是这原因,你可以试下先发6个数 再发送8个数 后七个数是你要发的正确数值,第一个数随便,你试下吧

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:77695 发表于 2015-4-22 13:00 | 显示全部楼层
superjiangzhen 发表于 2015-4-22 12:46
我估计你这不是进入死循环 你这里面就没有进入死循环的可能 你程序里有个判断 发送完7个8位数才进入disp_da ...

应该不是那得问题,我想这是发送错误数据AA BB 01 3F 00 FF,他不处理,然后再发正确的数据比如 AA BB 01 3D 11 00 FF时,他能正常处理,不受之前的影响。
回复

使用道具 举报

ID:68804 发表于 2015-4-22 13:41 | 显示全部楼层
我告诉你,是你的程序问题。要改为if(i>=6)就可以了。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:68804 发表于 2015-4-22 13:43 | 显示全部楼层
顺便再告诉你,你的数据等于六或小于六的时候很容易数组越界..
你的编程基础有待提高,还有的代码写的不规范,看了就头痛

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:72643 发表于 2015-4-22 14:03 | 显示全部楼层
你还是试一下我说的吧 先发6个再发8个 你那程序的确写的有问题

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:72643 发表于 2015-4-22 14:09 | 显示全部楼层
你有没有注意到,先发送6个数 i=6 是不能进入disp_data() 再发送7个数 发送第一个后进入disp_data(),不会有显示,你后面再发送6个数 i=6不能进入disp_data() ;你分析一下你的程序吧

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:142488 发表于 2016-10-12 20:27 | 显示全部楼层
谁有显示时分秒并可以调闹钟的啊
回复

使用道具 举报

ID:111634 发表于 2016-10-12 21:15 | 显示全部楼层
本帖最后由 zl2168 于 2016-10-12 21:18 编辑
c72477044 发表于 2016-10-12 20:27
谁有显示时分秒并可以调闹钟的啊

实例94  模拟电子钟(由80C51定时器产生秒时基)


Proteus仿真一下,确认有效。





以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。



回复

使用道具 举报

ID:142511 发表于 2016-10-12 21:29 | 显示全部楼层
前排不懂 顶顶
回复

使用道具 举报

ID:94642 发表于 2016-10-13 13:19 | 显示全部楼层
恩,顶顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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