查看: 13028|回复: 19

[提问] 关于RS485通信数据丢失问题

[复制链接]
发表于 2011-9-9 16:09:50 | 显示全部楼层 |阅读模式
关键词: RS485 , 数据丢失
10积分
RS485电路图.jpg
最近用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芯片上,通信一切正常,请各位高手帮我分析一下,是程序出现了问题,还是电路问题,谢谢大家!

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

我没看懂,请教一下,这个图是怎么工作的呢?
发表于 2014-3-23 09:18:55 | 显示全部楼层
可能是主机发送的太频繁,丛机没有反应过来主机的数据又来啦,丛机一直工作在中断中自然数据发不回去
发表于 2014-3-23 09:19:48 | 显示全部楼层
距离短的话你的电路没甚问题
发表于 2015-2-22 14:30:05 | 显示全部楼层
支持一下
发表于 2015-5-26 11:25:25 | 显示全部楼层
呵呵。简单。下载一份485规格书就可以的了。
发表于 2015-6-10 22:03:40 来自手机 | 显示全部楼层
我给你提一个意见,硬件没啥问题,看到有人说加匹配电阻,其实线很短,不加也没事,你有两个延时函数,如果程序正在执行第一个延时函数,如果我给你串口发数据了,但是你还没有拉低485接受信号线,也就是收不到,你不觉得逻辑有问题吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表