yanzi775 发表于 2010-1-14 14:56:55

求助 关于RS485通讯的问题

刚刚工作一个月,公司让接收设计一个项目,需要用485总线进行通讯的(主机发送地址,从机收到自己的地址时回传本机数据)。程序已经编写完毕,出现的现象是:当只有一台设备与上位机通讯时,能够正常进行通讯,但是当50台设备同时连接与上位机进行通讯时,会出现有十几台的设备不能正常通讯(不能正常收到总机发出的地址信息),不知道是由于我自己程序的问题还是跟MAX487的性能有关呢。因为是个新手,这又是我的第一个项目,确实是很着急,希望各位能够帮忙看看是哪里出现了问题。。。
    万分感谢!

dzcn 发表于 2010-1-14 16:09:42

上电路和程序

wychao 发表于 2010-1-14 16:49:07

建议查一下终端,这么多设备要加终端的,头和尾各一个;
建议设备逐个往上加试试,看看什么现象

yanzi775 发表于 2010-1-14 20:25:20

wychao,你好,谢谢你的答复。请问你说的加终端是什么意思啊?
我这几天一直在做测试,在50台从机中就有差不多20台通讯故障(就是不能正常接收主机发的地址)。我改了一点点,就是将从机接收到的所有地址都通过数码管显示出来,从数码管上看到那些通讯故障的从机接收到的地址并不稳定,时而正常时而会出现乱码,但是能够正常通讯的从机接收到的地址都是很有规律的从01到50。
    现在我真的不能确定到底是我程序的问题还是MAX487片子性能的问题,因为有时换487的片子又能解决问题,只是太频繁的换487不是解决问题的办法,希望大家能帮我分析分析!
    由于电路图是同事设计的,没有电子版的,没有办法传上来,通讯部分的程序我会在后面贴出来,大家帮我分析分析。

wychao 发表于 2010-1-14 20:51:17

"时而正常时而会出现乱码"可能是软件的问题,
MAX487没有用过,只要不是假片子,不会有问题的。
终端指的是终端电阻120欧的,485组网时,总线上只能有两个。
有 的正常,有的不正常是一对一通信的吗?还是组网的?一对一可以不用终端

jerkoh 发表于 2010-1-14 20:53:41

在主机 出来的地方接RS485的监视到 电脑 看是不是出来的数据 地址已经是错误的?
另外 是不是你的轮询没处理好,比如主机发地址01 ,等的时间太短,01由于处理慢没有及时回应你它收到了

你放弃了01轮询02,而02马上 响应了,但此时01也响应了 导致数据错误,这样连续好多都是错的

而你轮询一个的话 就不会错误


关键还是 轮询 和应答之间要处理好

如果排除了的话 还有2点,1 RS485 使能切换时最好延时1ms2 硬件电路可能设计有问题

yanzi775 发表于 2010-1-14 21:06:40

1.50台是通过一根总线连到PC,用VB编写的一个发送地址的软件,类似于串口调试助手。当50台同时接入时,出现有的不能回传数据。但是将不能回传的从机单独的跟主机连时(只一台进行通信),却能正常收发数据。由于只接了50台,两边的终端电阻并没有连入。
2.由于使用VB编写的发生地址功能,采用的是500ms发送一个地址,是不是时间还有点短?“RS485 使能切换时最好延时1ms”这个我确实没注意,明天我回公司再试试看。

yanzi775 发表于 2010-1-14 21:17:28

谢谢大家的帮助!需要补充的是,我程序采用的是中断接收和中断发送。呵呵,程序在公司里,明天给发上来大家帮我检查一下。

yanzi775 发表于 2010-1-21 21:33:52

前几天网站打不开,今天放上我的通讯部分程序,希望大家能够帮我看看程序是否有什么问题
void serial() interrupt 4
{
        uchar n,j;
        if(RI)
        {
                RI=0;
               
                if(flag1==0)
                {
                        if(SBUF==0xAB)
                  {
                                flag1=1;
                  }
                }
                else
                {
                  a=SBUF;
                  n++;
                  if(n>2)
                  {
                        n=0;
                        if(a==0xEF)
                        {
                          if((a==a)&&(a==address))
                          {
                                DR=1;
                                REN=0;
                                flag1=0;
                                SBUF=address;
                          }
                          else
                          {
                                flag1=0;
                          }
                        }
                        else
                        {
                          flag1=0;
                        }
                  }
                }
        }
        else
        {
                TI=0;
                if(num>0)
                {
                        SBUF=sedata;
                        num--;
                        j++;
                }
                else
                {
                        j=0;
                        num=25;
                        REN=1;
                        DR=0;
                }


        }
}

补充:数据通讯是主从式,主机发送地址,从机接收地址相比较,相同则发送本机数据给主机。数据格式为:0xAB address address oxEF。现在的问题是,当多台从机通讯时,部分从机(如T12号从机)不能够正常接收到地址。奇怪的是,T12一台单独与主机通讯时完全没有问题,真的很费解。

portx 发表于 2010-1-21 22:28:08

这种情况多数发生在487切换上,如果你用的是硬件模式切换的话问题出在软件上的几率较大,如果是软件控制切换的话看看是否有其他主机未能及时从发送状态切换至接受状态导致的总线长时间占用

dzcn 发表于 2010-1-21 22:44:12

n,j应该定义为全局变量吧

footp 发表于 2010-1-22 09:25:17

RS485不是只可以连接32个设备吗?

yanzi775 发表于 2010-1-22 10:19:47

portx 腾飞:这个课题中是将上位机作为主机,只有一台主机,是用VB编的一个软件,专门用于发送地址以及接受数据。487的切换时采用单片机的控制(应该是属于软件控制)。
dzcn 电子菜鸟:这个问题我待会儿去试试,谢谢你的提醒。
footp:RS485最多还可以带256台,关键是看你选择的什么通讯芯片(这是我个人意见,不知道对不对,呵呵)。

    我现在怀疑是我通讯的接受中断程序部分可能是有问题,但是真的是不知道该怎么改,希望大家能给我一些建议。再次感谢大家的热心帮助!!!

superrf 发表于 2010-1-22 10:43:55

上位机是计算机,可以查查上位机程序收发切换是否正确,计算机串口发送是有缓存的,程序发完不等于数据已经真的发完

interyujie 发表于 2010-1-22 11:03:45

回复【5楼】jerkoh
在主机 出来的地方接RS485的监视到 电脑 看是不是出来的数据 地址已经是错误的?
另外 是不是你的轮询没处理好,比如主机发地址01 ,等的时间太短,01由于处理慢没有及时回应你它收到了
你放弃了01轮询02,而02马上 响应了,但此时01也响应了 导致数据错误,这样连续好多都是错的
而你轮询一个的话 就不会错误
关键还是 轮询 和应答之间要处理好
如果排除了的话 还有2点,1 RS485 使能切换时最好延时1ms2 硬件电路可能设计有问题
-----------------------------------------------------------------------

增长主机放弃的时间 试试呢

yanzi775 发表于 2010-1-22 11:10:00

superrf:上位机的程序是由另外一个同事(张三)设计的。但是现在的情况是,用另外一个设备作为主机发送地址(相当于单片机与单片机之间的通讯,这也是再一个同事(李四)设计的,采用汇编编的程序)时,同样出现通讯故障的问题。
    唉,越说越糊涂了,反正情况确实是很复杂。正是因为与上位机(PC)还有监控设备通讯都有问题,所以怀疑是我程序设计上的问题。公司目前用C的就我一人,都不知道该怎么办?

footp 发表于 2010-1-22 15:39:15

看了max487的datasheet,确实可以连超过32,我把rs485的标准硬套了。

见过一个类似的,多点对多点,类似CSMA/CD,RS-232转RS-485连BUS.
每点发送前先读一下RS232 register看bus是否free....反正最后没有成功。

你的情况如果要我trouble shooting,我会先查硬件,是50台机连一BUS!
假设在一间课室,分成4分,每部分单独先连起来,然后2部分连起来,然后3。。。
搞清多少台机会出问题,与走线有没有关系(关系到延时)。

本人自知水平有限,希望没有误导。仅供参考。

pisgah 发表于 2010-1-22 15:51:24

不正常的模组是固定哪几个吗?先用这些不正常的一个一个慢慢加上去试试看。

yanzi775 发表于 2010-1-23 17:16:28

感谢大家还继续关注本帖!!!
    像大家说的,我也试过一台一台的往上加,当从机的台数少(5台)左右时,通讯基本上都没什么问题,但是一旦加到第六台时,就会其中有的从机就不能正常通讯了。后来我写了一个测试程序,用于显示从机接收到的主机发送过来的地址,后来发现不能正常通讯的从机接收到的地址会出现随机错误。
    本来我也怀疑可能是硬件设计上的问题。前两天,公司的另一个同事用汇编专门编写了一段通讯部分的程序作为测试,结果并没有出现通讯故障的问题。所以我现在觉得可能是我编程的水平有限,程序上有什么错误导致的通讯故障。想了很多天,对程序部分也仔细分析了,感觉都没有什么问题,真的很奇怪问题到底是出在什么地方?
    也许我自己已经走进思维怪圈了,有高手能按自己的思路帮我编一段通讯部分的程序吗?万分感谢了!

pujing 发表于 2010-1-23 17:58:20

建议楼主: 把通讯协议发上来, 例如你说的PC机发地址, 下位机发0xAB address address oxEF, 仅此而已吗,没有校验码?

          软件存在问题的可能性大, 硬件应该没问题, 因6台以下通讯是好的, 不要轻易怀疑硬件, 因为RS485总线带6台设备

            绝对没问题.

          主从通讯需考虑超时问题, 因为从机发送的数据中有可能含有其它从机的地址信息,请从这方面考虑一下.

dzcn 发表于 2010-1-23 22:41:42

思路大体是对的,建议将整个程序发上来

yanzi775 发表于 2010-1-30 11:16:01

折磨了我很久的通讯问题终于有点眉目了,今天在此结贴,希望对以后遇到类似问题的人有点用!
1.针对监控设备(单片机对单片机之间的通讯)的问题。由于监控(主机)的程序是另一个同事编写的,后来找到原因是由于在通讯过程中双方收发数据在时序上出现问题导致的。当主机没有准备好接收时,我的数据就发送了,导致通讯经常会出现问题。

2.对于从机没有响应的问题分析,是硬件设计的问题。当在MAX487的AB口加了上拉和下拉电阻的时候,通讯会有明显的改善。相关的电路网上很容易就能找到。

tingfenghu 发表于 2010-3-14 14:08:21

mark

goink 发表于 2010-3-14 14:36:31

useful

swustlx86 发表于 2011-11-11 13:12:10

mark

zhanliang 发表于 2011-11-23 09:41:27

你的MAX487的匹配电阻和终端电阻取的是多少?步线怎么步的?从机和主机之间距离有多长?距离与匹配电阻和终端电阻取值有关,距离超过1200米,需要加中继器
页: [1]
查看完整版本: 求助 关于RS485通讯的问题