
UART (Universal Asynchronous Receiver and Transmitter) là một chuẩn giao tiếp không đồng bộ nối tiếp được sử dụng rộng rãi để truyền dữ liệu giữa vi điều khiển (microcontroller) và máy tính. Ví dụ phổ biến nhất là dùng UART để gửi dữ liệu debug từ vi điều khiển lên máy tính qua cổng serial.
Ngoài ra, UART cũng được dùng để kết nối với nhiều thiết bị ngoại vi như máy in, thiết bị đầu cuối (terminal), và modem.
Từ “Universal” (phổ biến) có nghĩa là giao tiếp này có thể lập trình được, tức là bạn có thể tùy chỉnh cách nó hoạt động, như chọn tốc độ truyền dữ liệu (baud rate), số bit dữ liệu, kiểm tra lỗi, v.v.
Trong một số trường hợp, UART có thể được cấu hình để truyền dữ liệu theo cách đồng bộ, khi đó nó được gọi là USART.
Hãy cùng chipstack.vn tìm hiểu giao thức UART qua bài viết sau nhé!
Các chân của UART

Giao tiếp UART thông thường chỉ cần hai chân chính để truyền và nhận dữ liệu:
- TX (Transmit – Chân truyền dữ liệu)
- Chân này dùng để gửi dữ liệu từ thiết bị này sang thiết bị khác.
- Ví dụ: Vi điều khiển gửi dữ liệu qua chân TX đến máy tính.
- RX (Receive – Chân nhận dữ liệu)
- Chân này dùng để nhận dữ liệu từ thiết bị khác.
- Ví dụ: Máy tính gửi dữ liệu xuống vi điều khiển thông qua chân RX.
Tổng quan nguyên lý hoạt động
UART truyền dữ liệu dạng nối tiếp (serial) từ chân TX, tức là từng bit một thay vì truyền nhiều bit cùng lúc như giao tiếp song song.
Do không có tín hiệu xung nhịp chung, nên trước khi truyền dữ liệu, cả hai bên (bên gửi và bên nhận) phải thống nhất tốc độ truyền (baud rate).
Baud rate là số bit truyền đi trong một giây (ví dụ: 9600 baud có nghĩa là 9600 bit/giây).
UART có thể chấp nhận sai số xung nhịp lên đến 10% mà vẫn hoạt động bình thường.
Xem thêm: I2C là gì?
Kết nối giữa 2 thiết bị UART

1. Full-Duplex (Song công hoàn toàn)
Sử dụng hai đường truyền: TX và RX.
Dữ liệu được truyền theo cả hai hướng cùng lúc:
- Thiết bị A gửi dữ liệu qua TX → Thiết bị B nhận dữ liệu qua RX.
- Thiết bị B cũng có thể gửi dữ liệu qua TX → Thiết bị A nhận qua RX.
Ưu điểm: Truyền dữ liệu nhanh vì có thể gửi và nhận đồng thời.
2. Half-Duplex (Bán song công, một dây)
Bình thường, giao tiếp UART có hai dây: TX (truyền) và RX (nhận).
Trong Half-Duplex, chỉ có một dây duy nhất để vừa truyền vừa nhận dữ liệu.
Cách hoạt động của Half-Duplex:
- Khi thiết bị gửi dữ liệu, điều khiển chân TX để phát dữ liệu.
- Khi thiết bị nhận dữ liệu, tắt TX để lắng nghe tín hiệu từ thiết bị khác.
- Do chỉ có một dây, hai thiết bị không thể gửi và nhận dữ liệu cùng lúc → Chúng phải thay phiên nhau.
Trong chế độ này, TX phải được cấu hình là “open-drain” (nghĩa là nó chỉ có thể kéo xuống mức thấp hoặc nhả ra chứ không thể tự kéo lên mức cao).
Vì vậy, cần một điện trở kéo lên (pull-up resistor) để đảm bảo khi TX không truyền dữ liệu, nó sẽ ở mức cao thay vì “trôi nổi” (floating).
Ưu điểm: Giảm số lượng dây, phù hợp với giao tiếp đơn giản.
Nhược điểm: Không thể gửi và nhận dữ liệu cùng lúc.
Xem thêm: Open-drain là gì?
3. Chế độ giao tiếp đồng bộ (Synchronous Serial Communication)
USART (Universal Synchronous/Asynchronous Receiver/Transmitter) là một giao tiếp nối tiếp giống như UART, nhưng có thêm xung clock để đồng bộ dữ liệu giống như trong chế độ SPI master.
Sử dụng thêm chân CK để tạo xung clock.
Nguyên lý hoạt động:
- Bộ phát (Transmitter) tạo xung trên CK.
- Bộ nhận (Receiver) dùng xung này để lấy dữ liệu chính xác.
- Kiểu hoạt động này giống SPI, nhưng đơn giản hơn (chỉ có một đường dữ liệu TX và một clock CK).
4. Chế độ hardware flow control

Nếu sử dụng chế độ không đồng bộ (UART) thì RTS/CTS rất quan trọng để tránh mất dữ liệu:
- Nếu thiết bị nhận muốn nhận dữ liệu, nó sẽ kéo RTS xuống LOW để báo rằng muốn nhận dữ liệu.
- Khi CTS được kéo xuống LOW, bên thiết bị gửi sẽ gửi dữ liệu đi.
- Nếu CTS = 1, bên gửi dừng gửi để tránh làm tràn bộ đệm (buffer overflow).
Nếu USART chạy ở chế độ đồng bộ, có thêm CK (Clock), nhưng RTS/CTS vẫn có thể hoạt động bình thường:
- CK chỉ hoạt động khi CTS cho phép truyền dữ liệu.
- Nếu CTS = 1, bộ phát dừng truyền và CK cũng dừng.
- Khi CTS = 0, bộ phát tiếp tục truyền dữ liệu theo xung CK.
Xem thêm: SPI là gì?
Communication Frame
UART (Universal Asynchronous Receiver-Transmitter) chia dữ liệu cần truyền thành các frame (khung dữ liệu). Frame là đơn vị nhỏ nhất trong giao tiếp UART.

1. Cấu trúc của một frame UART
Mỗi frame bao gồm các phần sau:
- Start bit: Một bit bắt đầu có mức điện áp thấp (0V).
- Dữ liệu: Có thể dài 7, 8 hoặc 9 bit, tùy vào cấu hình.
- Bit chẵn lẻ (Parity bit – tùy chọn): Dùng để kiểm tra lỗi, có thể là Even (chẵn), Odd (lẻ) hoặc không có.
- Stop bit: Dùng để kết thúc frame, có thể có độ dài 0.5, 1, 1.5 hoặc 2 bit, thường mặc định là 1 bit.
Ví dụ một frame UART phổ biến: 8-P-1 (8 bit dữ liệu, 1 bit chẵn lẻ, 1 bit dừng).
2. Truyền dữ liệu trong UART
Dữ liệu được truyền bit từng bit, bắt đầu từ LSB hoặc MSB trước.
Ví dụ: Nếu gửi 0xE1 (1110 0001) và truyền LSB trước, thứ tự bit sẽ là 10001111 trên đường truyền.
3. Bit chẵn lẻ (Parity bit) – Kiểm tra lỗi
Bit chẵn lẻ (parity bit) là một bit kiểm tra lỗi trong UART. Nó giúp phát hiện nếu có lỗi xảy ra trong quá trình truyền dữ liệu.
Khi nhận dữ liệu, bộ nhận (receiver) sẽ kiểm tra lại tổng số bit 1 (bao gồm cả parity bit) để xem có đúng quy tắc hay không.
Giả sử bạn gửi 8 bit dữ liệu: 0001 0001 (2 bit 1).
- Even parity (chẵn): Tổng số bit 1 (bao gồm cả parity bit) phải là chẵn.
- Hiện tại có 2 bit 1 (đã chẵn), nên parity bit = 0.
- Dữ liệu gửi đi: 0001 0001 0
- Odd parity (lẻ): Tổng số bit 1 (bao gồm cả parity bit) phải là lẻ.
- Hiện tại có 2 bit 1 (chẵn), nên cần thêm 1 bit 1 để thành lẻ.
- Bit chẵn lẻ = 1.
- Dữ liệu gửi đi: 0001 0001 1
4. Stop bit và lỗi truyền dữ liệu
- Stop bit có mức điện áp cao (1) và dùng để đánh dấu kết thúc frame.
- Nếu không nhận được stop bit, frame bị lỗi và bị loại bỏ.
- Nếu không có dữ liệu mới, đường truyền giữ mức cao (1).
5. Cách đồng bộ dữ liệu giữa TX và RX

UART không có xung clock chung giữa bộ phát (TX) và bộ nhận (RX), nên dữ liệu có thể bị lệch hoặc nhiễu khi truyền đi. Để đảm bảo nhận đúng bit, UART dùng kỹ thuật oversampling – nghĩa là lấy mẫu nhiều lần trong mỗi bit dữ liệu.
Tốc độ lấy mẫu thường là 8 hoặc 16 lần tốc độ baud rate để tránh lỗi do nhiễu hoặc lệch xung clock:
- Khi nhận dữ liệu, thay vì chỉ đọc 1 lần mỗi bit, UART sẽ lấy mẫu 8 hoặc 16 lần trong khoảng thời gian của một bit. Sau đó, nó chọn giá trị chính xác dựa trên đa số các mẫu.
- Ví dụ: Nếu lấy mẫu 16 lần cho một bit, các giá trị nhận được có thể là: 0000000011111111
- 8 giá trị đầu là 0, 8 giá trị sau là 1 → Bit này được xác định là 1.
- Nhờ đó, dù có một vài mẫu bị nhiễu, UART vẫn có thể xác định đúng bit gốc.
Xem thêm: Tổng quan về Timer
Baud Rate
1. Baud rate là gì?
Baud rate ban đầu được dùng trong viễn thông để chỉ số lần tín hiệu thay đổi (xung) trong một giây.
Tuy nhiên, trong các hệ thống truyền dữ liệu số:
- Nếu một xung có thể biểu diễn nhiều bit (nhờ kỹ thuật điều chế pha, v.v.), tốc độ bit (bit rate) có thể lớn hơn baud rate.
- Nếu một xung chỉ biểu diễn 1 bit, bit rate = baud rate.
2. Baud rate trong UART
Trong UART, mỗi frame chứa cả dữ liệu và phần điều khiển (start/stop bit, parity, v.v.), nên tốc độ truyền dữ liệu thực tế (bit rate) thấp hơn baud rate.
Ví dụ:
- Baud rate = 9600 (tức là có 9600 tín hiệu trên đường truyền mỗi giây).
- Sử dụng chuẩn 8-N-1 (1 start bit, 8 data bit, 1 stop bit, không có parity).
- Mỗi frame có: 1 + 8 + 1 = 10 bits.
- Tốc độ truyền dữ liệu thực tế = 9600 / 10 = 960 bytes/giây, chứ không phải 9600 / 8 = 1200 bytes/giây.
Các tiêu chuẩn của UART
1. So sánh các chuẩn của UART
UART có nhiều chuẩn điện áp khác nhau để truyền tín hiệu, trong đó phổ biến nhất là RS-232, RS-422, RS-485.
RS là viết tắt của “Recommended Standard”, nghĩa là tiêu chuẩn được khuyến nghị.

2. Tín hiệu single-ended và tín hiệu differential

Tín hiệu đơn cực (RS-232)
- Dữ liệu được truyền qua một dây duy nhất, tham chiếu với mass chung.
- Dễ bị nhiễu do sự chênh lệch điện áp giữa các mass của hai thiết bị.
Tín hiệu vi sai (RS-422, RS-485)
- Dữ liệu được truyền qua hai dây, giúp loại bỏ nhiễu nhờ nguyên lý cộng hưởng đảo pha.
- Khi có nhiễu xuất hiện, nó ảnh hưởng đồng đều lên cả hai dây, và bộ thu có thể loại bỏ nhiễu bằng cách lấy hiệu giữa hai tín hiệu.
- Truyền tín hiệu xa hơn và ổn định hơn so với tín hiệu đơn cực.
3. Quy ước điện áp trong RS-232
Logic 1: Tín hiệu có điện áp từ +5V đến +15V.
Logic 0: Tín hiệu có điện áp từ -5V đến -15V.Dải điện áp hợp lệ của bộ thu:
- Nhận logic 1 nếu tín hiệu nằm trong khoảng +3V đến +25V.
- Nhận logic 0 nếu tín hiệu nằm trong khoảng -3V đến -25V.
- Tín hiệu trong khoảng -3V đến +3V là không hợp lệ.
Khi đường truyền ở trạng thái rảnh (idle), tín hiệu phải ở mức logic 0 (điện áp âm).
4. Sự không tương thích giữa RS-232 và các vi điều khiển
Các vi điều khiển chỉ hỗ trợ mức điện áp tối đa 5V, trong khi RS-232 sử dụng điện áp có thể lên đến ±15V.
Các vi điều khiển sử dụng 0V cho logic 0 và 3V cho logic 1, khác với quy ước của RS-232.
Vì vậy, không thể kết nối trực tiếp chúng với cổng RS-232 trên máy tính, cần có mạch chuyển đổi điện áp (ví dụ như IC MAX232) để chuyển đổi giữa mức điện áp của RS-232 và UART trên vi điều khiển.
5. Truyền dữ liệu qua UART (ví dụ với 0x32 và 0x3C)

Dữ liệu được truyền theo từng khung (frame) gồm:
- 1 bit start (luôn là 0V – logic 0).
- 8 bit dữ liệu (LSB truyền trước).
- 1 bit stop (luôn là 3V – logic 1).
Ví dụ dữ liệu 0x32 (0b00110010):
- Bit thứ tự truyền: 01001100.
Ví dụ dữ liệu 0x3C (0b00111100):
- Bit thứ tự truyền: 00111100.
Với baud rate 9600, mỗi bit có thời gian khoảng 0.104ms (1/9600).
UART là một giao tiếp nối tiếp phổ biến, giúp truyền dữ liệu giữa vi điều khiển và các thiết bị khác một cách hiệu quả. Với khả năng hoạt động linh hoạt, hỗ trợ cả chế độ song công và bán song công, UART được ứng dụng rộng rãi trong nhiều hệ thống nhúng. Hiểu rõ nguyên lý hoạt động, cấu trúc dữ liệu và các chuẩn điện áp sẽ giúp bạn tận dụng tốt giao tiếp này trong thực tế.
Xem thêm: Xung clock – Nhịp tim của hệ thống nhúng