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

2019-03-25 19:49发布

我以前用过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;
    }

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


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
newell
1楼-- · 2019-03-25 21:41
怎么没人回啊……都沉了……
请各位大侠帮帮忙吧!!
shizhang
2楼-- · 2019-03-26 03:40
你单片机到底是主的还是从的

          RD6=1;      //问题就在这命令,如果不执行这命令,子节点的接收完全正常
                            //如果执行这命令,子节点的接收就报错,而且接收不到数据
xinpingsj
3楼-- · 2019-03-26 09:22
 精彩回答 2  元偷偷看……
wisdom4515
4楼-- · 2019-03-26 12:25
没用过,随便说说。

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

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

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

另外,接收的MCU配置是否正确。
ykss
5楼-- · 2019-03-26 14:52
引用 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


123木头人
6楼-- · 2019-03-26 15:08
另外,接收的MCU配置是否正确。

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

一周热门 更多>