---
title: "認識UART界面#3—RS-485"
description: "**作者：Bird** 上篇文章[【Maker電子學】認識UART界面#2—通訊…"
url: "https://makerpro.cc/docs/uart-part3/"
updated: "2025-05-09"
category: UART
---

# 認識UART界面#3—RS-485

**作者：Bird**

上篇文章[【Maker電子學】認識UART界面#2—通訊標準](https://makerpro.cc/2020/01/uart-part2/)，我們聊了 UART 轉換到實體通訊界面 RS-232、RS-422 及 RS-485，這次我們來深入探究 RS-485 這個簡單易用且功能強大的通訊標準吧！

### **半雙工的 RS-485 網路**

上次說過，RS-485 和 RS-422 在實體層都是使用差動訊號來傳遞訊息，不過兩者的訊號規格略有不同。

RS-422 的傳送器電壓定義是：

邏輯 1：V~A-V~B= +2 V ~ +6 V
 邏輯 0：V~A-V~B= -2 V ~ -6 V

而 RS-485 的傳送器電壓定義則是：

邏輯 1：V~A-V~B = +1.5 V ~ +6 V
 邏輯 0：V~A-V~B = -1.5 V ~ -6 V

兩者在最低電壓的要求差了 0.5 V，但在接收端，不管是 RS-422 還是 RS-485，都只需要 200 mV 的電壓，就能夠判定邏輯 0 或 1：

邏輯 1：V~A-V~B > 200 mV
 邏輯 0：V~A-V~B < -200 mV

發射器和接收器之間電壓的差距，就是通訊標準所容許的實體層電氣損耗。典型的 RS-422 或 RS-485 只要搭配適當的纜線，可以將訊號傳輸至 400 英呎（130 公尺）之遠，靠的就是差動訊號耐干擾的特性以及其所容許的線上電氣損耗。

RS-485 是半雙工的通訊界面，它的傳送和接收共用同一對線路，典型的線路結構長這樣：

 ![](https://makerpro.cc/wp-content/uploads/2020/01/1-2.png)

（圖片來源：Bird 提供）

在這個圖中，總共有四個 RS-485 的裝置接在同一個網路上，並共用同一對傳輸線路。電路上看來，所有裝置的 A 點都是接在一起的，B 點亦同，因此我們可以說，在 RS-485 網路上所有的裝置都是並聯在一起的。

上圖也可看出，線路的兩端各有一個電阻 RT 將 A 和 B 連接起來，這個電阻叫做「終端電阻」（terminator），它的用意是在纜線的尾端將訊號消耗掉，避免訊號反射回來，同時也作為傳送電路的負載，典型的 RS-485 終端電阻是 120 Ω。

這種網路有個特別的名字叫做「multi-drop network」，其實就是「有很多裝置的網路」。在這種網路上，一次只能有一個裝置進入傳送模式，其它裝置則在接收模式，這是因爲接收器的阻抗通常很高，不太會消耗訊號，因此一個傳送器可以同時驅動很多個接收器，讓大家收到一樣的東西。以 RS-485 的標準而言，它允許網路上最多可以有 32 個裝置。

如果同時有兩個裝置進入傳送模式，它們傳送的訊號就有可能會打架！比方說一個裝置傳送 0，另一個裝置傳送 1，那線路上的狀態到底是 0 還是 1 呢？這根本就是一個不正常的狀態，會讓其它正在接收的裝置無所適從，因此在這種多裝置的網路上，必需要有一些規則，像是「先舉手再發言」、「沒人說話時再發言」或是「按照固定的順序輪流發言」等，以維持網路上的秩序。

當我們要用 UART 界面來控制 RS-485 時，會遭遇一個問題。先前說過，UART 是個「idle high」的界面，也就是說當我們沒在使用它時，它會維持在 high 的狀態，或是邏輯 1 。還記得嗎？但如果我們直接將 UART 的 TX（也就是傳送訊號），接在 RS-485 的傳送器上，當我們沒有在傳送資料時，UART 的 TX 始終會在邏輯 1 的狀態，那麼傳送器就會一直傳送 RS-485 的「1」出去，而如果這時候網路上有其它的裝置要傳送訊號，這個很堅持的邏輯 1 就會跟它打架，導致訊號整個垮掉。

因此在 multi-drop 的網路上，傳送器除了邏輯 0 和邏輯 1 外，還需要第三種狀態，叫做「不傳送」。它既不是 0 也不是 1，就是一個不去干預網路、隨波逐流的狀態，你也可以將它想像成「這個傳送器沒有接在網路上，彷彿不存在」。在這種「不傳送」的狀態下，對網路上的其它裝置而言，這個傳送器有一個很高的輸出阻抗，我們把這個狀態稱為「high impedance」，或是「Hi-Z」（電路學中常用大寫字母 Z 來代表阻抗）。

爲了要控制這種「不傳送」的狀態，RS-485 的傳送器除了連接 UART 的 TX外，還多了一個 enable 訊號，以用來控制傳送器的工作。當 enable 訊號讓傳送器工作時，傳送器會忠實地反應來自 UART 的邏輯訊號， 1 就是 1，0 就是 0，而當傳送器在工作狀態時，理論上網路上不應該有其它裝置同時也處於傳送狀態，否則網路上的訊號就會打架；如果 enable 訊號讓傳送器處於不工作狀態，對於網路上的其它裝置來說，這個傳送器就好似人間蒸發，不存在這個網路上，因此不管 UART 送來的是 0 或 1，都不會有訊號跑到 RS-485 的網路上。

這種有 enable/disable 能力的收發器，我們稱之爲「三態」收發器，或是 tri-state transciever，因爲它在 0 與 1 之外，還有一個 Hi-Z 的狀態。

### **RS-485 收發器實戰**

接著我們來說說 SN75176A 這顆 RS-485 收發器 IC。SN75176A 是 TI 在 1984 年推出的 RS-485 收發器 IC，歷史悠久，屹立不搖。

SN75176 只有八支接腳，比我們上回介紹的 RS-232 收發器 MAX232 還簡單。根據 RS-485 的規範，傳送側的驅動電壓最小只需要 2 V，因此 5 V 供電的 SN75176A 可以直接產生足夠的驅動電壓，不需要額外的 charge pump 輔助，若扣掉兩支電源接腳，SN75176A 的接腳功能如下：

 ![](https://makerpro.cc/wp-content/uploads/2020/01/1-3.png)

（圖片來源：Bird 提供）

A 和 B 腳是連接到 RS-485 網路的接腳，其中 A 是正端、B 是負端（這在 RS-485 訊號的標準命名中有明確規範）；D 是傳送用的資料接腳，通常連接到 UART 的 TX；R 是接收器出來的資料接腳，通常連接到 UART 的 RX。

 ![](https://makerpro.cc/wp-content/uploads/2020/01/1-4.png)

（圖片來源：Bird 提供）

DE 是 driver enable 的意思，也就是前面提到的「讓傳送電路工作的接腳。它是正邏輯，因此 high 的時候就是工作，low 的時候就是不工作；RE 是 receiver enable 的意思，它的原理和 DE 一樣，不過因爲這個訊號上面有一條線，代表它是負邏輯，也就是說當 RE 是 high 時，接收器是不工作的，當 RE 是 low 時，接收器才工作（接收器不工作時，它的輸出腳 R 就會變成 Hi-Z 的狀態）。

我們來看看實際要將 SN75176A 連接上 MCU 的 UART 時，電路該怎麼設計。這邊以 Aruino UNO 的 MCU： ATmega328p 爲例來說明。

 ![](https://makerpro.cc/wp-content/uploads/2020/01/Untitled-1.png)

（圖片來源：Bird 提供）

將 SN75176A 連接到 UART 的電路其實非常簡單，TXD 接到 D、RXD 接到 R，大概就完成 80%了，但問題是我們該如何用 GPIO 接腳來控制 DE 和 RE 呢？圖中的接法是一種很典型的做法：將 DE、RE 接在一起，並用同一支 GPIO 接腳控制。

由於 DE、RE 一個是正邏輯、一個是負邏輯，當我們將它們接在一起時，就像個翹翹板一樣，driver 工作時，receiver 就不工作；receiver 工作時，driver 就不工作。以這個例子來說，它的工作狀態就是：

 ![](https://makerpro.cc/wp-content/uploads/2020/01/1-6.png)

（圖片來源：Bird 提供）

這是一種很簡單的做法，因爲傳送的時候不接收，可以避免接收器收到自己送出去的資料，但這個特性有時候是個缺點，因爲有時候我們就是想要接收自己送出去的東西。

在什麼狀況下我們會需要接收自己送出去的資料呢？當我們需要「偵測碰撞」的時候。所謂「碰撞」就是網路上有兩個裝置同時傳送，導致線上的資料因爲狀態競爭而產生錯誤，就像前面說過的，如果一個裝置送 1、另一個裝置送 0，大家到底會收到 0 還是 1 就沒人說得準了。

因此，當我們需要硬體支援碰撞偵測時，可以這樣接：

 ![](https://makerpro.cc/wp-content/uploads/2020/01/Untitled-2.png)

（圖片來源：Bird 提供）

讓 DE 和 RE 分別由兩支 GPIO 個別控制，會產生四種狀態：

 ![](https://makerpro.cc/wp-content/uploads/2020/01/1-8.png)

（圖片來源：Bird 提供）

當我們需要碰撞偵測功能時，可以將 PD3 設爲 high、PD4 設爲 low，要寫資料到 UART 的 TX 時，資料就會經過傳送器、接收器繞一圈回來，出現在 RX 上。我們可以比對 TX 和 RX 上的資料，如果兩者相同，就代表訊號成功發送出去了；如果 RX 收到的資料和 TX 送出去的不同，就代表線上可能同時有其它裝置在傳送，導致線上的狀態錯誤。

這個電路中有一個神祕的 10 KΩ 電阻 R1，將 R 腳拉到 5 V 電源，它是用來幹嘛的呢？前面提過，當 RE 爲 high 的時候，receiver 不工作，R 腳的狀態就是高阻抗，這對 UART 的 RX 而言，就是沒有接任何東西。

數位的輸入接腳空接是電路設計的大忌，因爲你不知道它會收到 0 還是收到 1，而且因爲 CMOS 電路高輸入阻抗的特性，只要一點點的風吹草動，就足以讓它在 0 與 1 之間搖擺，而讓 UART 收到一大堆莫名其妙、亂七八糟的東西，因此我們用一個相對來說較弱的 pull-up 電阻，在 R 腳進入 Hi-Z 狀態時，將它拉到 high，這就確保了當 receiver 不工作時，UART 的 RX 會被維持在 high，也就是 idle 的狀態，而當 receiver 在工作時，R 腳的輸出能力應該要足以輕易對抗這個 10 KΩ 的電阻，訊號就不會受到影響。

另外我們在 SN75176A 的電源接腳上用了稍大的旁路電容（C4 10 uF），這是因爲 RS-485 相對來說是一個電壓較低、電流較大的傳輸界面，而 driver 在驅動較長線路時會需要較大的電流，所以若加上稍大的電源旁路電容，可以改善電源的阻抗，同時也能降低它吃電時對其它電路的影響。

### **小結**

除了 SN75176A 外，TI 也有新一代的 RS-485 傳送接收 IC—SN65HVD485E，它的輸入阻抗更高，最多可容許 64 個裝置在同一條線上，且有更好的 ESD 耐受性。

其實各家 IC 大廠也都有推出 RS-485 的傳送接收 IC，而且接腳都與 SN75176 相容（這個接腳的安排已經形成一種工業標準），像是 Maxim 的 MAX485、Linear Technology 的 LTC485、Renesas 的 ISL8485 等都是與 SN75176A 接腳相容的 RS-485 transceiver，在設計上也都是很好的選擇。

讀者們如果有什麼問題，或是對哪個主題有興趣想更深入探討，也歡迎留言，我會作爲之後寫作及安排題目的參考。

（責任編輯：賴佩萱）
