RS485协议

本文详细介绍了RS485的电气特性,对比了共模传输和差模传输,指出差模传输可有效抵消共模干扰。还阐述了RS-485的电气参数,如共模电压范围、多点拓扑连接、传输速率等。此外,说明了RS-485的半双工通信特点及收发器控制原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RS485 电气特性

共模传输

在这里插入图片描述

采用共模传输方式时,共模噪声将会叠加在最终的输出信号上面,污染了原始的信号。

差模传输

在这里插入图片描述
而采用差模传输方式,则源端发出的信号+与信号-相位是相反的,而对于共模噪声而言在+/-两条线上都会存在,理想情况是等幅同相的,而接收端,相当于一个减法器,有用信号由于相位相反则经过减法器仍然保留,而噪声则会被抵消。而实际电路中,则会大幅度削弱。

由此可见,差模传输相对于共模传输方式,优势在于差模方式可以有效抵消共模干扰。

电气参数

RS-485 的电气参数为:

  • 共模电压范围为 -7~+12V
  • 可支持 32 个多点拓扑连接,见下面的网络拓扑图
  • 使用 40 英尺线缆时,传输速率可达到 10Mbps,1 英尺相当于 30.48cm,这里 Mbps 是兆 bit/s 的意思
  • 使用 4000 英尺线缆时,传输速率可达到 100kbps
  • 半双工通信

最小差分电压容限:200mV,也就是说接收端在差分电压低于 200mV 时就无法正确识别 0/1 了。这句话应该怎么理解呢?
在这里插入图片描述
上面这个图怎么理解呢?RS-485 收发器的发送电路至少提供 1.5V 差分电压输出能力,经由总线线路阻抗衰减,32 个接收电路输入阻抗,以及 120Ω 端接电阻,差分信号的幅度必然逐渐衰减,那么至最末端还需要至少提供 200mV 的差分电压给末端接收电路。

V A B = U A − U B V_{AB} = U_{A} - U_{B} VAB=UAUB:对于接收电路是判决 A 线共模电压与 B 线共模电压之差;

  • 如果 V A B > = 200 m V V_{AB} >= 200mV VAB>=200mV 则接收电路 R 识别为逻辑1;
  • 如果 V A B < = − 200 m V V_{AB} <= -200mV VAB<=200mV 则接收电路 R 识别为逻辑0;

简单说就是,A线的绝对电压值比B线的至少大于200mV则识别为逻辑1,或者A线的绝对电压值比B线的至少小200mV,才识别为逻辑0

这里的参数,应该是在一定特征阻抗线缆时的理论值,实际工程使用的时候需要做相应的调整以及现场测试。一般以不超出这个理论极限为好。

说到电气特性参数,首先来看看一般的接口电路:
在这里插入图片描述
从这样一个接口电路来看,有这么些要点:

  • RS-485 通信从 单片机/DSP/处理器 接口而言,是利用 UART接口 与 RS-485电平收发器接口。

    当然你说我用 FPGA 难道不行么?肯定是可以的,用 FPGA 你实现一个串口收发的 IP模块,当然也是可以的。甚至你想说,我拿 GPIO 去模拟一下 UART 是不是就不行?也是能办得到的,只不过这么干意义不大,需要占用 CPU 资源实现底层 BIT 的收发。

  • 前面说到半双工,有半双工就有全双工。

    什么是半双工呢?首先半双工以及全双工,所界定的对象一定是点对点而言的,这里说点对点就是指在同一时刻而言,所谓半双工,就是设备在同一时刻要么处于收数据状态,要么处于发数据状态,不允许同时收发数据。

    而全双工则刚好相反,允许同时收发。比如 I2C总线 就是半双工总线,4线制 SPI 是全双工,而三线制 SPI 则是半双工总线;又譬如 RS-422 或者 RS-232 是全双工接口;而 CAN总线 则是半双工总线。RS-485 就是一种半双工总线。

在这里插入图片描述

当 Host 发送数据时,数据沿着红色的线经由双绞线,传输至 Slave 的差分接收电路,当 Slave 应答时,数据沿着兰色的方向传输至 Host 的接收电路,但是传输介质是一对双绞线,所以一方在传输数据的时候,另一方是无法传输信号的,从收发器的控制角度来看:

  • R E ‾ \overline{RE} RE:Receiver Output Enable,接收器使能;
  • D E DE DE:Driver Output Enable,驱动输出使能;

控制芯片侧,用一个 GPIO 脚来控制和 R E ‾ \overline{RE} RE D E DE DE,刚学设计 RS-485 的朋友或许不理解,这里来一张芯片内部原理框图,就很容易理解了
在这里插入图片描述

当 DIR=0 时,接收电路使能 R E ‾ = 0 \overline{RE} = 0 RE=0,发送电路禁止 D E = 0 DE = 0 DE=0,对总线而言相当于高阻;

当DIR=1时,接收电路使能 R E ‾ = 1 \overline{RE} = 1 RE=1,发送电路禁止 D E = 1 DE = 1 DE=1,对总线 A/B 信号取决于 DI 的信号。这里有两个问题:

  1. 为什么芯片要把 R E ‾ \overline{RE} RE D E DE DE 设计成相反的有效逻辑呢?这样其实也是方便用一个 GPIO 同时控制收发电路的考虑。

  2. 那收发器芯片收发使能为什么不做成一个脚呢?比如就叫 DIR?做成两个脚收/发也可以用两个脚单独控制,比如:
    在这里插入图片描述
    甚至可以在 D E = 1 DE=1 DE=1 的时候,将 R E ‾ \overline{RE} RE 设置为0,这样是不是就可以自环了?产品中也可以就这样设计,可以实现收发器以及布线的自诊断,通过接收到的报文与发送出去的报文比较,可以诊断出芯片焊接,收发器是否损坏或者断路,以及布线是否存在短路故障。
    或许有人会说,瞎扯!你前面才说 RS-485 不能同时收发,这里又说能同时收发,岂不是自相矛盾吗?不矛盾,前面所说的不能同时收发,是指发的同时不能收来自其他设备的发送报文,这里收的是自身发出的报文。
    所以半双工的本质,是通讯介质不存在双向通道,在向总线发送数据的时候,介质被占用,即便想发送也是无法正确的将信号发送到介质上的,如果强行发送,数据将会错乱,甚至收发器芯片有可能损坏。

参考与原文

图文详解RS-485,真的很详细了 - 知乎 (zhihu.com)

### RS485协议介绍及使用方法 RS485是一种差分信号通信标准,广泛应用于工业控制、自动化系统和长距离数据传输中。以下是关于RS485协议的详细介绍、使用方法以及数据传输的相关内容。 #### 1. RS485协议简介 RS485是一种多点差分数据传输标准,支持半双工或全双工通信模式。它允许多个设备连接到同一总线上,通常用于点对点或多点通信系统。与RS232相比,RS485具有更高的抗干扰能力、更远的传输距离和更快的数据速率[^1]。 - **电气特性**:RS485使用差分信号传输,通过两条线路(A线和B线)实现数据的发送和接收。差分信号能够有效减少电磁干扰的影响。 - **拓扑结构**:RS485支持总线型拓扑结构,理论上最多可以连接32个节点(具体数量取决于收发器的驱动能力)。 - **传输距离和速率**:在较低波特率下(如9600bps),RS485可以实现长达1200米的通信距离;而在高波特率下(如1Mbps),传输距离会显著缩短[^2]。 #### 2. RS485硬件组成 实现基于RS485接口的数据收发需要以下关键组件: - **RS485收发器芯片**:常见的RS485收发器包括MAX485、SP3485、ADM2587等。AC620开发板使用的是SP3485芯片,该芯片支持3.3V供电,电路设计简单且功能完整[^1]。 - **驱动电路**:为了保护收发器并提高通信稳定性,通常会在RS485总线上添加终端电阻(一般为120欧姆)以消除反射信号。 - **使能控制**:RS485芯片通常需要手动控制发送使能(DE)和接收使能(RE)。对于低速通信场景,可以通过硬件电路实现自动控制;而对于高速通信,则需要软件精确控制收发切换[^2]。 #### 3. 数据传输方式 RS485本身不定义具体的通信协议,而是作为一种物理层标准提供数据传输的基础。实际应用中,通常结合高层协议(如Modbus RTU)实现数据交换[^3]。 - **半双工通信**:大多数RS485系统采用半双工模式,即同一时刻只能进行发送或接收操作。发送时需将DE引脚置高,接收时需将RE引脚置低。 - **收发切换策略**:在低速通信场景下,可以通过TX信号与DE/RE引脚之间的反向逻辑电路实现自动切换。而在高速通信中,必须由软件精确控制收发切换的时机,确保数据完整性。 #### 4. 使用教程 以下是基于RS485协议的典型使用步骤: ```c #include <stdio.h> #include <unistd.h> #include <termios.h> int configure_rs485(int fd) { struct termios options; tcgetattr(fd, &options); // 获取当前串口配置 cfsetispeed(&options, B9600); // 设置输入波特率为9600 cfsetospeed(&options, B9600); // 设置输出波特率为9600 options.c_cflag |= (CLOCAL | CREAD); // 启用接收器 options.c_cflag &= ~PARENB; // 禁用校验位 options.c_cflag &= ~CSTOPB; // 使用1位停止位 options.c_cflag &= ~CSIZE; // 清除字符长度掩码 options.c_cflag |= CS8; // 设置8位字符长度 tcsetattr(fd, TCSANOW, &options); // 应用新的配置 return 0; } void send_data(int fd, const char *data, int len) { ioctl(fd, TIOCMSET, &(int){TIOCM_RTS}); // 设置发送使能 write(fd, data, len); // 发送数据 usleep(100); // 延迟一段时间 ioctl(fd, TIOCMSET, &(int){0}); // 清除发送使能 } void receive_data(int fd, char *buffer, int len) { read(fd, buffer, len); // 接收数据 } ``` 上述代码示例展示了如何配置Linux下的串口以支持RS485通信,并提供了发送和接收数据的基本函数[^2]。 #### 5. 高层协议支持 在工业控制领域,Modbus RTU是最常用的高层协议之一。它基于主从架构,允许主机向从机发送命令并接收响应数据。Modbus RTU报文格式包括地址字段、功能码、数据字段和CRC校验字段[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值