正文


大家好,我是bug菌~

在工业通信和嵌入式开发中,RS485凭借高抗干扰性和多节点支持成为主流总线之一。但许多工程师在调试RS485时,常对两个关键信号——DE和RTS——产生混淆:它们看起来都是“控制发送”的信号,甚至有些电路中将两者直接连接。

那么,DE和RTS是同一个东西吗?为什么它们会被混为一谈?本文从原理到实践,彻底讲清两者的区别与联系。

1

DE与RTS介绍 

1. DE(Driver Enable)

DE脚是控制RS485收发器的发送使能,直接控制物理层驱动器,所以大家平时也叫它RS485的“控制器”。

• DE=有效:收发器处于发送模式,将数据推送到总线。

• DE=无效:收发器切换为接收模式,监听总线数据。

在半双工通信中,确保同一时刻只有一个设备占用总线,避免数据冲突。用法就是设备A发送数据前,先拉高DE,发送完成后立即释放DE,转为接收。如果多个设备同时激活DE,总线电平混乱,通信失败,这也是很多初学者在玩RS485经常遇到的问题。

2. RTS(Request To Send)

其实RTS最早跟RS485根本没关系,它是来自RS-232的硬件流控制信号。

用于协调收发双方的传输节奏,大致过程如下:

• RTS=有效:发送端请求接收端准备接收数据。

• 接收端响应:通过CTS(Clear To Send)信号通知发送端是否允许发送。

所以RTS的作用就是防止接收端缓冲区溢出,确保数据可靠传输。

以前玩51单片机的USB转九针串口基本上里面就有RTS和CTS,通过PC通过串口向设备发送数据时,设备通过RTS/CTS流控暂停PC的发送,避免丢包。

所以两者设计初衷完全不同!

2

为何容易混淆?

那到底又是什么原因让工程师让这两者难舍难分呢?

在部分UART接口较弱的单片机或者Soc在设计RS-485电路时,工程师利用UART自动控制RTS的特性实现DE的自动使能。这样软件工程师就可以不用去单独翻转一个IO口来简化RS485驱动,逻辑过程大致如下:

发送数据时,UART自动拉低RTS → 反相后DE被激活。

发送完成时,RTS释放 → DE关闭。

而且很多时候RTS与DE复用成一个引脚,但是他们并不是一回事,只是一个引脚复用罢了。

所以类似于stm32这样的UART接口外设驱动RS485,只需DE控制发送使能,无需RTS/CTS流控。

3

两者区别

信号行为与时序差异整理如下:

特性

DE(Driver Enable)

RTS(Request To Send)

激活时机

在数据发送前提前激活(Assertion Time),发送后延迟关闭(Deassertion Time)。

在发送数据前请求接收端准备(如RTS拉低),接收端通过CTS响应。

时序要求

必须严格匹配收发器的响应时间,确保数据帧完整。

时序由流控协议定义,通常与数据帧同步,无额外延迟需求。

信号极性

可配置为高电平或低电平有效(取决于收发器设计)。

通常为低电平有效(RS-232逻辑:负电压为有效)。

大家可以看到DE需设置DEAT(Assertion Time)和DEDT(Deassertion Time),如

• 发送前:DE提前2个位时间激活,确保收发器稳定。

• 发送后:DE延迟3个位时间关闭,避免最后一个停止位被截断。

所以在stm32这样的UART控制器中都有DE电平极性控制和延时控制,有时候相关参数不匹配会导致RS485通信不稳定。

而对于 RTS信号:

• 发送请求:发送端拉低RTS,接收端以CTS响应。

• 无严格时序:RTS/CTS只需在数据传输期间保持协调,无需精确提前或延迟。

要制作出稳定可靠的嵌入式系统必然是经验的不断积累和知识的不断完善。

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

唯一、永久、免费分享嵌入式技术知识平台~

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 

☞  嵌入式C语言进阶专辑 

☞  “bug说”专辑 

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐