Cách tính thời gian truyền UART từ baudrate
Cách tính thời gian truyền 1 byte và một dòng log UART dựa trên baudrate, frame format và độ dài message.
Ghi chú nhanh
UART thường truyền 1 byte theo frame gồm:
1 start bit + 8 data bits + 1 stop bit = 10 bits
Với baudrate 115200 bps:
Thời gian truyền 1 byte = 10 / 115200 ≈ 86.8 µs
Nếu một dòng log dài 60 ký tự:
60 × 86.8 µs ≈ 5.2 ms
5 ms nghe không nhiều, nhưng trong firmware real-time, 5 ms đôi khi là cả một đời người.
Vì sao phải tính?
Nhiều người cảm giác UART debug “nhanh” vì terminal hiện chữ gần như ngay lập tức. Nhưng cảm giác của mắt người không giống timing của MCU.
Nếu task của bạn chạy mỗi 1 ms, một dòng log blocking mất 5 ms có thể làm task trễ 5 chu kỳ.
Nếu bạn đọc tín hiệu bằng interrupt, log trong ISR còn nguy hiểm hơn: UART chưa truyền xong thì interrupt khác đã phải chờ.
Công thức tổng quát
Với UART format phổ biến 8N1:
bits_per_byte = 1 start + 8 data + 1 stop = 10 bits
time_per_byte = bits_per_byte / baudrate
time_message = number_of_bytes × time_per_byte
Ví dụ với 115200 bps:
| Độ dài log | Thời gian truyền xấp xỉ |
|---|---|
| 10 byte | 0.87 ms |
| 30 byte | 2.60 ms |
| 60 byte | 5.21 ms |
| 100 byte | 8.68 ms |
Baudrate cao hơn có giải quyết hết không?
Tăng baudrate giúp giảm thời gian truyền, nhưng không giải quyết toàn bộ vấn đề.
Ví dụ 921600 bps nhanh hơn 115200 bps khoảng 8 lần. Tuy nhiên:
- không phải USB-UART adapter nào cũng ổn định ở baudrate cao;
- dây dài hoặc môi trường nhiễu có thể gây lỗi;
- terminal/log tool trên PC cũng có giới hạn;
- nếu log quá nhiều, buffer vẫn có thể đầy.
Vì vậy baudrate cao là một phần giải pháp, không phải giấy phép để printf() vô tội vạ.
Khi nào dùng phép tính này?
- Khi đánh giá
printf()có làm chậm firmware không. - Khi chọn baudrate debug UART.
- Khi debug task bị trễ trong RTOS.
- Khi thiết kế buffer cho UART logger.
- Khi quyết định log nào được giữ, log nào phải tắt.
Cách nhớ
UART 115200 không nhanh như cảm giác của mình.
Một dòng log dài có thể tốn vài ms để truyền vật lý.
Bài liên quan nên đọc tiếp
- HAL_UART_Transmit() blocking như thế nào?
- Producer-Consumer pattern trong hệ thống logging embedded
- Thiết kế hệ thống UART logging non-blocking trên STM32
Thấy nội dung này hữu ích?
Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
HAL_UART_Transmit() blocking như thế nào?
Giải thích vì sao HAL_UART_Transmit() giữ CPU trong lúc chờ UART truyền xong dữ liệu và khi nào nó trở thành vấn đề real-time.
DMA Normal mode và Circular mode khác nhau thế nào?
Phân biệt DMA Normal mode và Circular mode khi dùng UART, ADC, audio stream hoặc logger trên STM32.
HAL_BUSY xảy ra khi nào trong UART DMA?
Giải thích lỗi HAL_BUSY khi gọi HAL_UART_Transmit_DMA() trong lúc UART/DMA vẫn đang truyền dữ liệu trước đó.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.