Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 60329|回复: 21

[教程] Arduino UNO使用RS485实现串口通信

[复制链接]
发表于 2017-8-2 13:57 | 显示全部楼层 |阅读模式
本帖最后由 Yuri-Chen 于 2017-8-3 14:24 编辑

2017.8.3更新代码,之前通信工作不稳定!!!
2017.8.3更新代码,之前通信工作不稳定!!!
2017.8.3更新代码,之前通信工作不稳定!!!
本人学习Arduino也快一个月了,最近想利用RS485模块实现串口通信,于是买了两块MAX485模块。如下图: 1111.jpg
这种模块唯一好处是便宜,但是用起来并不太方便,这个后面叙述。
我的实验是利用两块MAX485给两个Arduino UNO实现软串口通信,用硬串口观察各自收发情况,目前已调试成功,下面上电路图:
5555.jpg

1.接线方法:
1.将Arduino上的数字引脚10、11设置为软串口RX和TX与MAX485模块上的RO和DI连接;
2.MAX485模块上的RE和DE连接在一起用一个引脚2控制MAX485收发状态切换;

2.代码:
[mw_shl_code=c,true]/*      Master      */
#include <SoftwareSerial.h>
SoftwareSerial Master(10, 11);
char val;
int DE_RE=2;

void setup() {
  Serial.begin(38400);   
  Serial.println("Master is ready!");
  Master.begin(38400);
  pinMode(DE_RE,OUTPUT);  
  digitalWrite(DE_RE,LOW);
}

void loop() {
  while (Serial.available()) {
    digitalWrite(DE_RE,HIGH);
    val = Serial.read();
    Master.write(val);
  }

  digitalWrite(DE_RE,LOW);
  while(Master.available()) {
    val = Master.read();
    Serial.write(val);
  }
}[/mw_shl_code]

[mw_shl_code=c,true]/*      Slave     */
#include <SoftwareSerial.h>
SoftwareSerial Slave(10, 11);  
char val;
int DE_RE=2;

void setup() {
  Serial.begin(38400);   
  Serial.println("Slave is ready!");
  Slave.begin(38400);
  pinMode(DE_RE,OUTPUT);   
  digitalWrite(DE_RE,LOW);
}

void loop() {
  while (Serial.available()) {
    digitalWrite(DE_RE,HIGH);
    val = Serial.read();
    Slave.write(val);
  }

  digitalWrite(DE_RE,LOW);
  while(Slave.available()) {
    val = Slave.read();
    Serial.write(val);
  }
}[/mw_shl_code]
由于这个RS485模块是半双功,所以代码里要切换MAX485的收发状态以保证不会总线冲突,以上程序可以实现主从机既可以接收又可以发送。

3.实验结果:
IMG_20170802_134726.jpg
在Master里发送"Hello",Slaver可以收到;在Slaver里发送"OK",Master也可以收到。
1122.png
PS:虽说这款模块调试通了,但是个人觉得还是下面这款比较好用
222.png
因为你可以不用理会何时接收何时发送,从而避免总线冲突,你就可以把它当作全双工的串口增强驱动器使用!


发表于 2017-8-2 17:59 | 显示全部楼层
学习····  哈哈·
发表于 2017-8-3 19:47 | 显示全部楼层
中文可以吗,新手教一下
 楼主| 发表于 2017-8-6 21:52 | 显示全部楼层
Anson.Chow 发表于 2017-8-3 19:47
中文可以吗,新手教一下

你是歪果仁吗
发表于 2017-8-11 21:47 | 显示全部楼层

呃呃,我是说串口通信传递中文字符。。。
发表于 2017-10-24 16:50 | 显示全部楼层
请问485怎么实现长距离的传输呢,新手上路
发表于 2017-10-29 18:48 | 显示全部楼层
学习中,请问怎么实现断线检测呢?
发表于 2017-11-1 19:00 | 显示全部楼层
你好
想请教您关于arduino与485通讯的技术,方便联系吗?
发表于 2017-11-28 23:33 | 显示全部楼层
想问下:为什么不直接用UNO板的RX,TX脚进行收发?
发表于 2017-11-29 10:29 | 显示全部楼层
mozhiyue 发表于 2017-11-28 23:33
想问下:为什么不直接用UNO板的RX,TX脚进行收发?

那个是硬件串口,用来下载程序的,485占用后,每次下载程序都要拔掉485
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2023-1-27 12:29 , Processed in 0.075169 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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