第11章 Arduino UART(TTL Serial)序列通訊入門與實作

發布日期: |更新日期:
文章主圖:第11章 Arduino UART(TTL Serial)序列通訊入門與實作

UART(Universal Asynchronous Receiver/Transmitter)是 Arduino 與電腦、感測器、藍牙模組、GPS 及其他微控制器交換資料時最常見的序列通訊方式之一。

本章將從 UART、TTL Serial 與 RS-232 的差異開始,說明 Arduino Uno 的 RX、TX 腳位、鮑率設定、Serial Monitor 操作,以及 Serial.print() 與 Serial.println() 的實際用法。

進行接線前,必須先確認雙方的工作電壓。Arduino Uno 使用 5V TTL 邏輯,部分模組則使用 3.3V,不能只依照 TX、RX 名稱直接連接。

本章學習目標

完成本章後,你將能夠:

  • 了解 UART(Universal Asynchronous Receiver/Transmitter)的工作原理。
  • 分辨 UART、TTL Serial 與 RS-232 的差異。
  • 學會使用 Serial.begin()、Serial.print() 與 Serial.println()。
  • 使用 Serial Monitor 與 Arduino 傳送及接收資料。
  • 建立後續連接藍牙、ESP8266、GPS、GSM 等模組的通訊基礎。

什麼是 UART?

UART 是 Universal Asynchronous Receiver/Transmitter 的縮寫,中文通常稱為「通用非同步收發器」。它是一種不需要共用時脈訊號的序列通訊方式,資料會依序逐位元傳送。

Arduino Uno 內建一組硬體 UART,可用來與電腦、藍牙模組、GPS、其他微控制器及各類序列設備交換資料。

  • 資料一次傳送 1 個 bit。
  • 通訊雙方不需要共用 Clock 時脈線。
  • 主要使用 TX 與 RX 兩條訊號線,並且必須共地。
知識卡:UART
項目 說明
全名 Universal Asynchronous Receiver/Transmitter
中文名稱 通用非同步收發器
通訊方式 非同步序列通訊
Arduino Uno UART 腳位 D0(RX)、D1(TX)
常見鮑率 9600、19200、38400、57600、115200 bps

什麼是 TTL Serial?

Arduino Uno GPIO 腳位輸出的 UART 訊號採用 TTL 邏輯電位。以 Uno R3 為例,LOW 約為 0V,HIGH 約為 5V,這種 UART 電氣訊號通常稱為 TTL Serial。

GPS、HC-05 藍牙模組、ESP8266 等裝置常使用 TTL Serial,但各裝置的工作電壓不一定相同。連接前應先查閱模組規格,確認 RX 腳是否能承受 Arduino Uno 的 5V 訊號;必要時應使用分壓或邏輯電平轉換器。

Arduino Uno TTL 邏輯電位
狀態 電壓(約)
LOW 0V
HIGH 5V

UART、TTL Serial 與 RS-232 的差異

UART、TTL Serial 與 RS-232 常被混用,但三者代表不同層面的概念。UART 是通訊控制器與資料傳輸方式;TTL Serial 是 UART 搭配 TTL 邏輯電位的訊號;RS-232 則是一套不同的電氣規範。

UART、TTL Serial 與 RS-232 比較
名稱 代表意義 Arduino Uno 是否可直接使用
UART 通訊控制器與非同步序列通訊方式 可以
TTL Serial 使用 TTL 邏輯電位的 UART 訊號 可以,但需確認 5V/3.3V 相容性
RS-232 使用正負電壓的序列通訊電氣規範 不可以,必須使用電平轉換器

為什麼 Arduino 不能直接連接 RS-232?

傳統 RS-232 可能使用約 +3V~+15V 與 -3V~-15V 的正負電壓表示邏輯狀態。Arduino Uno 的 GPIO 不適合承受這類電壓,因此不能把 RS-232 設備直接接到 D0、D1。

連接 RS-232 設備時,應使用 MAX232、MAX3232 或功能相同的電平轉換模組。選用前仍應確認轉換器的供電電壓、接頭定義與訊號方向。

Arduino Uno 的 UART 腳位與接線方式

Arduino Uno UART 腳位
腳位 名稱 用途
D0 RX(Receive) 接收外部設備傳送的資料
D1 TX(Transmit) 向外部設備傳送資料

兩台 UART 設備連接時,TX 與 RX 必須交叉。Arduino 的 TX 要接到對方的 RX,Arduino 的 RX 要接到對方的 TX。

除了 TX 與 RX,雙方還必須共地,也就是將兩台設備的 GND 連接在一起。沒有共同參考電位時,即使鮑率設定正確,也可能無法穩定接收資料。

Arduino TX(D1) → 對方 RX
Arduino RX(D0) ← 對方 TX
Arduino GND       ─ 對方 GND

USB 為什麼也能使用 Serial?

Arduino Uno 除了主要的 ATmega328P 微控制器外,板上還有負責 USB 通訊轉換的晶片。官方 Uno R3 常見為 ATmega16U2,部分相容板則可能使用 CH340 等 USB-to-Serial 晶片。

當 Arduino IDE 上傳程式,或 Serial Monitor 與開發板通訊時,USB 通訊晶片會在電腦的 USB 資料與 ATmega328P 的 UART 訊號之間進行轉換。

電腦 USB
   ↓
USB 通訊轉換晶片
   ↓
UART
   ↓
ATmega328P

使用 Serial.begin() 設定鮑率

使用序列埠前,必須先在 setup() 中呼叫 Serial.begin(),並指定通訊鮑率。下列程式會啟用硬體序列埠,通訊速度設定為 9600 bps。

void setup()
{
  Serial.begin(9600);
}

void loop()
{
}

什麼是 Baud Rate?

Baud Rate(鮑率)用來表示通訊速度。一般 Arduino UART 教學中,常以 bps 表示每秒傳送的位元數。

通訊雙方必須使用相同的鮑率。若 Arduino 程式設定為 9600,而 Serial Monitor 選擇 115200,畫面通常會出現亂碼或無法辨識的字元。

常見 UART 鮑率與用途
Baud Rate 常見用途
9600 Arduino 初學範例、部分 GPS 模組
19200 一般序列設備
38400 部分藍牙或工控設備
57600 較高速的序列通訊
115200 ESP8266、ESP32 或大量除錯輸出

Serial.print() 與 Serial.println()

Serial.print():輸出後不換行

Serial.print() 會輸出文字或變數內容,但游標會停在同一行,適合將多個資料組合成一行。

Serial.print("Temperature = ");
Serial.print(25);
Temperature = 25

Serial.println():輸出後自動換行

Serial.println() 在輸出資料後會加入換行,下一次輸出會從新的一行開始。

Serial.println("Hello Arduino");

第一個 Arduino Serial 實驗

下列程式每隔 1 秒輸出一次 Hello Arduino。上傳完成後,開啟 Arduino IDE 的 Serial Monitor,並將鮑率設定為 9600。

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.println("Hello Arduino");
  delay(1000);
}

預期 Serial Monitor 會每秒顯示一行 Hello Arduino。若沒有輸出,應先確認選擇的開發板、序列埠與鮑率是否正確。

Hello Arduino
Hello Arduino
Hello Arduino

輸出 analogRead() 讀取的變數

Serial 是 Arduino 除錯時最常用的工具。以下範例讀取 A0 的 ADC 數值,並在 Serial Monitor 顯示結果。

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int sensorValue = analogRead(A0);

  Serial.print("ADC = ");
  Serial.println(sensorValue);

  delay(500);
}

實際數值會依 A0 的輸入電壓而改變。預期輸出格式如下:

ADC = 632
ADC = 630
ADC = 628

使用 Serial Monitor 除錯

Serial Monitor 是 Arduino IDE 中重要的序列通訊與除錯工具。除了顯示開發板傳出的資訊,也能把使用者輸入的文字傳送給 Arduino。

開發程式時,可在重要流程加入序列輸出,確認感測器數值、條件判斷、函式執行順序或錯誤狀態。正式完成程式後,再依需求減少過多的除錯訊息。

  • 顯示感測器讀值與計算結果。
  • 確認程式執行到哪一個步驟。
  • 觀察 if 判斷與狀態變數是否正確。
  • 接收使用者輸入,例如輸入指令控制 LED。
  • 檢查外部 UART 模組是否有回傳資料。

使用 Serial Plotter 繪製數值變化

Arduino IDE 的 Serial Plotter 可以把連續輸出的數值轉換成折線圖,適合觀察溫度、光照、超音波距離、可變電阻與其他感測器的變化。

為了讓圖形穩定顯示,每一筆資料應使用一致的輸出格式。若同時輸出大量說明文字,可能影響 Serial Plotter 解析數值。

UART 常見錯誤與故障排除

Serial Monitor 顯示亂碼

最常見原因是鮑率不一致。確認程式中的 Serial.begin() 與 Serial Monitor 右下角選擇的鮑率完全相同,也要確認外部設備本身使用的鮑率。

TX 接到 TX 或 RX 接到 RX

一般 UART 通訊要使用交叉接法:TX 接對方 RX,RX 接對方 TX。若設備名稱標示方式特殊,應以該設備資料表或接線說明為準。

忘記連接共同 GND

兩台設備沒有共地時,TX 與 RX 缺少共同電壓參考,可能完全收不到資料,也可能出現不穩定或間歇性錯誤。

外部模組占用 D0、D1 導致程式無法上傳

Arduino Uno 的 D0、D1 同時用於硬體 UART、USB 序列通訊與程式上傳。若外部模組持續驅動這兩個腳位,可能造成上傳失敗或序列資料互相干擾。

  • 上傳程式前,先拔除連接 D0、D1 的外部模組。
  • 確認上傳完成後,再依正確方向接回 TX、RX 與 GND。
  • 低速通訊可評估使用 SoftwareSerial,但要留意效能與可靠性限制。
  • 需要多組硬體 UART 時,可考慮具備多組序列埠的 Arduino Mega 2560。

5V 與 3.3V 電位不相容

部分 UART 模組的 RX 腳只能接受 3.3V。若直接接收 Arduino Uno TX 的 5V 訊號,可能造成通訊異常,甚至損壞模組。接線前必須查閱規格,必要時使用分壓電阻或雙向邏輯電平轉換器。

本章實作練習

練習一:每秒輸出文字

使用 Serial.println("Hello Arduino"); 每秒輸出一次文字,並確認 Serial Monitor 的鮑率與程式設定一致。

練習二:顯示 A0 的 ADC 值

使用 analogRead(A0) 讀取類比輸入,將 ADC 數值持續輸出到 Serial Monitor,並轉動可變電阻觀察數值變化。

練習三:顯示 ADC 值與電壓

將 ADC 值換算為電壓並輸出。以下範例假設 ADC 參考電壓約為 5.0V;實際值會受開發板供電與參考電壓影響。

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int adcValue = analogRead(A0);
  float voltage = adcValue * (5.0 / 1023.0);

  Serial.print("ADC = ");
  Serial.println(adcValue);

  Serial.print("Voltage = ");
  Serial.print(voltage, 2);
  Serial.println("V");

  delay(1000);
}

Challenge:製作序列除錯工具

建立一個每秒輸出 ADC 數值、換算電壓與 LED 狀態的序列除錯工具,並讓所有資訊排列在同一行。

const int ledPin = 13;

void setup()
{
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int adcValue = analogRead(A0);
  float voltage = adcValue * (5.0 / 1023.0);
  bool ledOn = adcValue >= 512;

  digitalWrite(ledPin, ledOn ? HIGH : LOW);

  Serial.print("ADC: ");
  Serial.print(adcValue);
  Serial.print("  Voltage: ");
  Serial.print(voltage, 2);
  Serial.print("V  LED: ");
  Serial.println(ledOn ? "ON" : "OFF");

  delay(1000);
}
ADC: 512  Voltage: 2.50V  LED: ON

本章重點整理

  • UART 是非同步序列通訊方式,TTL Serial 是使用 TTL 邏輯電位的 UART 訊號,RS-232 則是不同的電氣規範。
  • Arduino Uno 使用 D0(RX)與 D1(TX)作為硬體 UART 腳位。
  • Serial.begin() 用於設定鮑率,通訊雙方必須採用相同的鮑率。
  • Serial.print() 不會自動換行,Serial.println() 會在輸出後換行。
  • TX 與 RX 通常採交叉接線,兩台設備還必須共地。
  • 外接模組前要確認 5V 與 3.3V 邏輯電位是否相容。
  • D0、D1 被外部模組占用時,可能影響 Arduino Uno 程式上傳。

下一章預告

第 12 章將介紹 I²C(Inter-Integrated Circuit)雙線通訊,包括 SDA、SCL、Arduino Uno 的 I²C 腳位、Wire.h 函式庫、I²C Scanner,以及 LCD1602 I²C、OLED、RTC、BMP280 等模組的通訊方式。

相關資源與文章匯出
下載 Arduino 入門基礎教材 下載 DOCX PDF/列印

← 回文章列表