打印

求助高手帮忙看一下单片机双机通信的问题

[复制链接]
1402|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guo9322|  楼主 | 2007-8-25 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
照课本上的例子写的,看了感觉没问题,编译也能通过,下载到单片机上就是不好用.找了很长时间也找不出毛病。
B机(接收)程序:
#include <reg51.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar idata buf[1];
uint pf;
void init1(void)           //串口初始化//
{ TMOD=0x20;
  TH1=0xe8;
  TL1=0xe8;
  PCON=0x00;
  TR1=1;
  SCON=0x50;
}
void receive(uchar idata *d)
{  uchar i;
   do
   {  while(RI==0);
      RI=0;
   }while((SBUF^0xaa)!=0);           //判断A机发送请求//
   SBUF=0xbb;                        //发应答信号//
   while(TI==0); 
   TI=0;       
   while(1)
   {  pf=0;
      for(i=0;i<16;i++)
       { while(RI==0);
         RI=0;
         d=SBUF;          //接收数据//
         pf+=d;           //求校验和//
        }
      while(RI==0);
      RI=0;
      if((SBUF^pf)==0)        //比较校验和//
       { SBUF=0x00;           
          break;
       }
      else 
       { SBUF=0xff;          //出错发FF 重新接收//
         while(TI==0);
         TI=0;
       }
  }
}
void main()
{ init1();
  receive(buf);
   }
A机(发送)程序:
#include <reg51.h>
#include <absacc.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int 
uchar idata buf[1]={0x35};
uchar ab=0;
uint pf;
uchar a,m,p;
void init1(void)           //串口初始化//
{ TMOD=0x20;
  TH1=0xe8;
  TL1=0xe8;
  PCON=0x00;
  TR1=1;
  SCON=0x50;
}
void send(uchar idata *d)
{  uchar i;
   do
   { SBUF=0xaa;              //发送联络信号//
     while(TI==0);           //等待发送成功//
     TI=0;
     while(RI==0);           //等待B机//
     RI=0;
    }while((SBUF^0xbb)!=0);   //B机未准备好,继续联络//
    do
    { pf=0;
      for(i=0;i<16;i++)
       { SBUF=d;            //发送数据//
         pf+=d;
         while(TI==0);
         TI=0;
       }
      SBUF=pf;                 //发送校验和//
      while(TI==0);
      TI=0;
      while(RI==0);
      RI=0;
    }while(SBUF!=0);           //B机回答出错则重发//
}
void main(void)
{ init1();
   send(buf);
}

相关帖子

沙发
sjiton| | 2007-8-26 17:49 | 只看该作者

经验

程序我没有仔细看 

一般来讲问题可能不在程序,而可能是
1:交叉线连接错误。
2; 232芯片由于带电操作已经坏了。

使用特权

评论回复
板凳
guo9322|  楼主 | 2007-8-27 09:52 | 只看该作者

我是近距离的,不需要rs232吧??

两片单片机离得很近的,没超过1m

使用特权

评论回复
地板
dafei| | 2007-8-31 11:49 | 只看该作者

通信握手的问题

通信握手的逻辑太脆弱了,要不就加强,要不就不要握手了。

比如:A机发0xAA的时候,如果B机还每初始化好,肯定握不上了,死循环。
如果,B机SBUF里有上次的数,则认为收到的握手信号不是0xAA,死循环。
如果,A机SBUF里有上次的数,收到的应答信号不是0xBB,死循环。

使用特权

评论回复
5
wenbinjj| | 2007-9-4 12:04 | 只看该作者

那本书是垃圾

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

33

帖子

0

粉丝