关于RS485通信数据丢失问题

2011年09月09日 16:09    发布者:she1987

最近用STC12C5202AD芯片,实现主机与从机通信功能,用的是RS485协议,上面是RS485电路图,现在的情况是只能收发一个数据,无论主机发送多少个数据,从机也只能收发一个数据,调试了整天也没有找到原因,下面是我编写的程序:
#include
unsigned  char TEMP,a;
sbit RE = P1^2;      //接收允许开关
sbit DE = P1^1;      //发送允许开关
/**************************************
     延时程序
**************************************/
void delay(unsigned char i)
{
unsigned char j;
  for(i; i > 0; i--)
    for(j = 200; j > 0; j--);
}
void init()
{
  TMOD=0X20;      //设置定时器的工作方式为方式2,自动重装8位数据
  TH1=0XFD;       //波特率9600的初始值
  TL1=0XFD; //波特率9600的初始值
  SCON=0X50; //设置串口的模式为方式1并置为REN使串口工作
  TR1=1;  //启动定时器工作
  EA=1;  //开启总中断
  ES=1;  //开启串口中断  
  DE = 0;
  RE = 0;   //允许接收,禁止发送数据
}
void main()
{
  init();      //调用初始化子函数
  //delay(50);
  while(1)       //死循环
   {
     if(TEMP==1)     //判断是否接收完数据
      {
       DE = 1;
      RE = 1;    //允许发送,禁止接收数据
      delay(50);
        EA=0;    //关闭串口中断
        TEMP=0;    //变量TEMP清0
        SBUF = a;    //把a的值送到发送SBUF中去,注意此SBUF不同中断函数里面的接收SBUF
        while(!TI) ;    //等待数据发送完毕
        TI = 0;  //发送完数据后清0
        delay(50);
        EA=1;  //开启串口中断
        DE = 0;
   RE = 0;   //允许接收,禁止发送数据
   delay(50);
      }
   }

}
void ser() interrupt   4
{
  RI=0;     //接收完数据后软件清除中断标志位
  a = SBUF;     //把他放进变量A中为了读取返回
TEMP=1;     //置位TEMP
}

该程序如果去掉延时,用在RS232芯片上,通信一切正常,请各位高手帮我分析一下,是程序出现了问题,还是电路问题,谢谢大家!

网友评论

sherwin 2011年09月14日
程序不懂,仅就硬件说两句:
1、输出端,A、B两线之间,要并联一个120欧姆的负载匹配电阻。必要时,最好再串接一个平衡滤波器。
2、供电脚(pin 8)最好能再并一个10uF的电解,以确保供电稳定。
zjx_embcom 2011年09月14日
你这个程序实现的功能是:从主机收一个数据,再将该数据发送给主机。当然无法连续的接收到主机上发送的数据的。因为你在发数据的时候,就没有办法接收数据。这个485是工作在半双工的状态。
mutou868 2011年09月15日
如果你是连续发送数据,则串口一直产生中断,无法执行其他程序。
c86518 2011年09月18日
我也正遇到同样的问题。四套STC11F04XE+MAX485CSE连接到一起。一个单片机发送,其他单片机接收。通过反复调试发现,若连续发送4个字节,只能接收到前两个字节。若间隔1秒发送一个字节,则都能收到。感觉到MAX485接收很慢。
c86518 2011年09月18日
如果哪位高手解决问题,请通知一声c86518@163.com。
网上相关485注意事项都看过了。
liuanmuyu 2011年09月27日
好好研究
暗之声 2011年09月28日
那个3脚一边是DE,一边是DO,不会是这里有问题吧,其他的我都看不懂.
暗之声 2011年09月28日
图上3脚一个是DO,一个是DE
暗之声 2011年09月28日
那个3脚一边是DE,一边是DO,不会是这里有问题吧,其他的我都看不懂.
sc88cs 2011年09月29日
你这个程序这样写也是没问题的。
只不过主机发送的程序要配合从机。
主机发了一个数据,等从机收到并且返回了再发下一个就可以了。。。。。
你的程序有很多不好的地方,效率不高,尽量利用中断来延时和中断来发送数据就好点。。。。
Zaxife 2011年10月08日
1 485芯片A、B端没接上下拉电阻,没接中间电阻,会导致控芯片制信号逻辑不正确,两个控制端短接为一个读写电平;
2 定义全局数组,每次串口接收中断把数据堆入数组,主程序每次循环都检测数组里面的数据有效性,数组超限自动出栈最先进来的数。如果数据有效则取数到临时数组后标记全局数组为无效数据。
3 默认情况下主程序控制485芯片为接收状态。当需要发送数据时才控制485芯片为发送状态,状态转换时间可以累加变量来判断,不要用延时子程序。while(!TI)也是用累加变量来判断实现超时功能清TI,不要一直等待.....
建议去单片机仿真论坛看看吧http://proteus.5d6d.com
richedy 2011年10月11日
学习中
Wilson2010888 2011年10月11日
就硬件电路而言,我建议你改进一下,贴一个我量产过的485电路
46583
笑梨 2014年03月13日
Wilson2010888 发表于 2011-10-11 15:18 static/image/common/back.gif
就硬件电路而言,我建议你改进一下,贴一个我量产过的485电路

我没看懂,请教一下,这个图是怎么工作的呢?
deli333 2014年03月23日
可能是主机发送的太频繁,丛机没有反应过来主机的数据又来啦,丛机一直工作在中断中自然数据发不回去
deli333 2014年03月23日
距离短的话你的电路没甚问题
pcbkey 2015年02月22日
支持一下
lucent 2015年05月26日
呵呵。简单。下载一份485规格书就可以的了。
sgj511285515 2015年06月10日
我给你提一个意见,硬件没啥问题,看到有人说加匹配电阻,其实线很短,不加也没事,你有两个延时函数,如果程序正在执行第一个延时函数,如果我给你串口发数据了,但是你还没有拉低485接受信号线,也就是收不到,你不觉得逻辑有问题吗?