5837|9

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

PIC单片机做RS-485通讯时遇到的问题,急请高手指教!! [复制链接]

我以前用过MEGA64和51做RS485通讯效果都很好,但是这次用PIC16F877A就遇到比较麻烦的问题,请各位高手指点!!

应用要求:一个主控板,通过轮询方式访问多个子节点。轮询时间间隔是0.5s

硬件:MAX487,用光耦TLP521隔离,单片机是PIC16F877A

问题:主控板连续发送数据时(不切换到接收状态,只是发送状态),子节点接收正常。但是,当主控板发送完数据,从发送状态切换到接收状态时,子节点的接收就报错,而且数据接收失败!!

曾试过的方法:读取TXIF和TRMT标志位判断发送完,然后切换到接收状态;
                     读取TXIF和TRMT标志位判断发送完,再加延时,然后再切换到接收状态。但是无论延时有多长,还是出现同样的问题。

代码如下:用C写的
          RCIE=0;    //禁止接收中断
          RD6=0;     //允许发送(RD6为MAX487的控制引脚:0为发送;1为接收)
          for(i=0;i<10;i++);
            
          TXREG=TXdata;

          TXEN=1;          //使能发送

          for(i=0;i<250;i++);
          TXEN=0;          //禁止发送

          while(TXEN==1||TRMT==0)
            {;}

          RCIE=1;
          RD6=1;       //问题就在这命令,如果不执行这命令,子节点的接收完全正常
                             //如果执行这命令,子节点的接收就报错,而且接收不到数据

也试过在中断中发送
  if(TXIE&&TXIF)
    {
      char i;   
  
      TXREG=TXdata;
      for(i=0;i<10;i++);

      TXIE=0;

      while(TRMT==0&&TXIF==0)
        {;}
      RCIE=1;
      RD6=1;
    }

请问各位大侠有什么好建议和好方法呢?
请各位大侠指点!!小弟急!!先谢过各位的仗义!!


最新回复

485简单,但你程序有点问题,后面的几句就不妥  详情 回复 发表于 2009-10-28 15:04
点赞 关注
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没人回啊……都沉了……
请各位大侠帮帮忙吧!!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你单片机到底是主的还是从的

          RD6=1;      //问题就在这命令,如果不执行这命令,子节点的接收完全正常
                            //如果执行这命令,子节点的接收就报错,而且接收不到数据
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
先谢谢大侠回复!!
这段代码是主控板上的
先往子节点发送命令,然后切换到接收状态,准备接收子节点的数据。
但是一旦切换就会出现问题
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
没用过,随便说说。

好像是判断一个字节发送完成有问题。你可以看看MCU的datasheet,
-----
for(i=0;i <250;i++);
TXEN=0;          //禁止发送

while(TXEN==1||TRMT==0)
{;}
-----

这样能确保一个字节发送结束了吗?

另外,接收的MCU配置是否正确。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 zyzhang365 的回复:
没用过,随便说说。

好像是判断一个字节发送完成有问题。你可以看看MCU的datasheet,
-----
for(i=0;i <250;i++);
TXEN=0;          //禁止发送

while(TXEN==1||TRMT==0)
{;}
-----
这样能确保一个字节发送结束了吗?

另外,接收的MCU配置是否正确。


  TXEN=1;        // Enable transmitter
  TXREG=TXdata;  // Write data to the buffer
  while(TRMT==0) // Spin while transmitting
  {;}

  TXEN=0;        // Disable transmitter

  for(i=0;i <250;i++); // Idle for a while
  RD6=1;         // Switch the mode to RX
   
  RCIE=1;        // Enable Rx Interrupt


 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
另外,接收的MCU配置是否正确。

如果主控板不切换状态,子节点的接收是没问题的,子节点的配置应该不会有问题吧
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
嗯,先别沉啊……
问题还没能解决……
请问还有没大侠说说啊?
请问有做过485的吗?
急……
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
不懂,顶一个!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
485简单,但你程序有点问题,后面的几句就不妥
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表