极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 54688|回复: 27

Arduino接MAX485模块,可以发送但无法接收数据,有没有大侠能解决?

[复制链接]
发表于 2013-7-25 16:18:06 | 显示全部楼层 |阅读模式
      用Arduino MEGA 2560的板子,接了一个MAX485的模块,RO接板子RX0,DI接板子TX0,DE与RE一起接入pin2脚,A与B跟一485转USB模块的A与B相连,USB模块接入电脑。接线应该是没有错误,已经检查过多遍,USB模块测试过也没有问题,MAX485应该也是没有问题的,因为用该连接写过一个只发送不接收的程序,是完全正常的。现在的程序是要通过USB模块输入一个信号,Arduino MEGA 2560通过MAX485接收后进行判断,然后再通过MAX485模块返回一个信号。程序首次运行时,通过Arduino自带串口工具可以正常接收一次返回一个信号,之后就未有反应。电脑用SSCOM32通过USB转485模块则完全没有反应,包括板子上的RX信号灯都不闪。本以为很容易实现的程序,但该问题折腾了我好多天了,哪怕只是写最简单的串口接收程序,也是无法运行。请各位大侠赐教,不胜感激!!


int EN = 2;int TEXT = 0;int LED = 8;
int val=0;String data="";
void setup()
{  pinMode(EN,OUTPUT);
   pinMode(LED,OUTPUT);
   Serial.begin(2400);}
void loop()
{   while (Serial.available()>0)
  {   digitalWrite(EN,LOW);
      data += char(Serial.read());
      delay(2);
      if (data=="22")
      {   val = analogRead(TEXT);
          digitalWrite(EN,HIGH);
          if(val>1000)
          { Serial.write("#2201");
            delay(1000); }
         else
           { Serial.write("#2200");
             digitalWrite(LED,HIGH);
             delay(500);
             digitalWrite(LED,LOW);
             delay(500); }
      }
  }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-7-25 17:39:39 | 显示全部楼层
485不是硬件吗,好像跟编程无关。先检查一下是不是硬件出问题了,再看软件。
自己的一点看法
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2013-7-25 18:25:12 | 显示全部楼层
爱若天意 发表于 2013-7-25 17:39
485不是硬件吗,好像跟编程无关。先检查一下是不是硬件出问题了,再看软件。
自己的一点看法

如果只是让arduino发送数据,在电脑上是可以用SScomm32正常收到的,硬件应该是没有问题的,有问题应该电脑也接收不到吧?现在唯独arduino板收不到电脑通过串口发来的数据。
回复 支持 反对

使用道具 举报

发表于 2013-7-25 18:49:23 | 显示全部楼层
板子上的RX信号灯都不闪,貌似就是没收到电脑发来的数据吧,初学者我也不知道
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-25 20:06:38 | 显示全部楼层
爱若天意 发表于 2013-7-25 18:49
板子上的RX信号灯都不闪,貌似就是没收到电脑发来的数据吧,初学者我也不知道

是的,就是没收到电脑发的数据。用Arduino自带的串口调试,就可以收到。但那个是通过板子的USB口发过去的,不是实际的485信号
回复 支持 反对

使用道具 举报

发表于 2013-7-26 08:38:06 | 显示全部楼层
接错线了吧你!

1,改485模块接MEGA2560的串口1,将串口0留给ARDUINO的IDE使用;如果是短距离,可靠一点的话将485与串口0共地!
2,改一下你的程序:
485是半双工的,你程序里确实加了发送和接收的切换,但其实切换前是要加延时的,至少延时一个字符的传送时间;说明白一点就是你应该在 digitalWrite(EN,LOW/HIGH);这一句前面加delay(ms);ms=??  ms=一个字符的传送时间,要根据你的BUAD算一下!
3,建议你先做单接收和单发送的程序,全部调通了再上又发送又接收的......
4,只要你不使用软串口,把速率拉上去,2400下去试485简直是浪费,你这点距离,115200都不算快的!使用软串口时,速率大于57600会现乱码!



回复 支持 反对

使用道具 举报

发表于 2013-7-26 13:44:51 | 显示全部楼层
MAX485的RX或TX依靠一个端口的的高低电平控制,所以需要半双工传输时,需要自己定义一套协议来处理收发,大家可以参照一些工业标准。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-27 17:46:27 | 显示全部楼层
拾瑞 发表于 2013-7-26 08:38
接错线了吧你!

1,改485模块接MEGA2560的串口1,将串口0留给ARDUINO的IDE使用;如果是短距离,可靠一点的话将 ...

谢谢拾瑞的解答,确实Arduino串口0的使用都有些问题,不只是MEGA2560,电路图上是跟板载芯片连接在一起的。之前也有试过加延时,但加在了digitalWrite(EN,LOW)之后。板子上单做发送的是没有问题的。接收的话用IDE的串口调试也不太正常。这里只是做测试,完成后会用远距离通信,还会经过光端机走光纤,所以速率也不敢太高。
后来,我舍弃了在板子上的调试,改用MEGA8做了个小电路,直接烧录程序到芯片,已经调试成功。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-27 17:47:20 | 显示全部楼层
gaoshine 发表于 2013-7-26 13:44
MAX485的RX或TX依靠一个端口的的高低电平控制,所以需要半双工传输时,需要自己定义一套协议来处理收发,大 ...

多谢gaoshine的解答
回复 支持 反对

使用道具 举报

发表于 2013-7-28 12:40:40 | 显示全部楼层
arsuila 发表于 2013-7-27 17:46
谢谢拾瑞的解答,确实Arduino串口0的使用都有些问题,不只是MEGA2560,电路图上是跟板载芯片连接在一起的 ...

我忘记和你说了,你需要在RS485模块的RX端加上上拉电阻,一般485通讯如果发送正常接收不正常,都是这个原因!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-12 10:24:44 | 显示全部楼层
拾瑞 发表于 2013-7-28 12:40
我忘记和你说了,你需要在RS485模块的RX端加上上拉电阻,一般485通讯如果发送正常接收不正常,都是这个原 ...

是不是在A和B间加个120Ω的电阻?
回复 支持 反对

使用道具 举报

发表于 2013-8-12 17:28:42 | 显示全部楼层
arsuila 发表于 2013-8-12 10:24
是不是在A和B间加个120Ω的电阻?

1,不是的,485芯片的第一脚(就是接TTL的RX脚的),用个10K电阻,上拉到VCC......
2,A,B也要分别接上下拉,具体为A上拉5-10K,B下拉5-10K,上下拉电阻应该是一样的.......

以上电阻值,不是一成不变的,你需要自己试!
回复 支持 反对

使用道具 举报

发表于 2014-7-30 15:53:24 | 显示全部楼层
请问楼主。。我跟你的板子型号,max485模块以及接线时一样的。R0---RX0;DI--TX0;DE+RE--D2;A--变频器的SG+.B---变频器的SG-。(SG+和SG-是台达变频器的rs485通信口)。我发的控制命令数据一直不起作用。我想问的是:我的连线有问题吗??
回复 支持 反对

使用道具 举报

发表于 2014-7-30 15:55:19 | 显示全部楼层
楼主能把最终的接线和代码给我一下吗???!!
回复 支持 反对

使用道具 举报

发表于 2014-10-11 09:19:38 | 显示全部楼层
小小东熙 发表于 2014-7-30 15:55
楼主能把最终的接线和代码给我一下吗???!!

请问你问题解决了么
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 11:48 , Processed in 0.043944 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表