Chân tx rx là gì

Về chúng tôi

Arduino.vn được xây dựng trên nền tảng Drupal 7, phiên bản hiện tại 2.3 tên mã Chia sẻ tình yêu với Arduino.

Đây là trang thông tin phi lợi nhuận ra đời hướng tới cộng đồng trẻ, những chủ nhân tương lai của đất nước. Tìm hiểu thêm

Chuẩn giao tiếp truyền thông nối tiếp UART trên Arduino [hay còn được biết đến với tên gọi Serial] là chuẩn giao tiếp được sử dụng rất nhiều trong các ứng dụng hệ thống nhúng. Trong bài viết này, mình sẽ hướng dẫn các bạn tiếp cận và lập trình với giao tiếp UART một cách đơn giản nhất, còn về cơ bản sâu hơn thì các bạn xem tại bài viết này.

Khai báo UART: 
– Có 2 cách để khai báo sử dụng UART trên Arduino, nhưng phổ biến nhất là Serial.begin[9600], trong đó 9600 là tốc độ baud và sử dụng khung truyền mặc định 8-N-1 [8 bit dữ liệu, không sử dụng bit kiểm tra chẵn lẻ, 1 bit kết thúc]. Bạn có thể tìm hiểu kĩ hơn tại đây.  Đồng thời việc khai báo này cũng chuyển chân digital 0 và digital 1 thành chức năng truyền nhận dữ liệu: Chân digital 0 được gắn với bộ nhận dữ liệu bên trong vi điều khiển và chân digiatal 1 được nối với bộ truyền dữ liệu bên trong vi điều khiển.


Nối dây 2 thiết bị: 
– Nếu các bạn sử dụng Board Arduino để giao tiếp với máy tính [sử dụng cửa sổ Serial monitor trên ARDUINO IDE] thì không cần phải nối thêm gì cả vì trên board Arduino đã thực hiện sẵn việc đó, chỉ cần cắm cab USB vào là được. Để hiểu thêm về cấu trúc của board Arduino thì các bạn có thể xem qua bài viết này.
– Nếu các bạn sử dụng Arduino để giao tiếp với 1 thiết bị, 1 module khác thì các bạn nối chéo, TX – RX và RX – TX và đừng quên 1 điều là kiểm tra xem 2 thiết bị đã chung GND chưa, vì nếu chưa thì chúng sẽ không hiểu mức logic của nhau ==> không giao tiếp được.
– Phức tạp hơn tí nữa là nếu như 2 thiết bị khác mức logic, ví dụ như 1 thiết bị 5v giao tiếp với 1 thiết bị 3.3V thì các bạn cần thêm các mạch để chuyển đổi điện áp cho phù hợp.

Truyền dữ liệu:
– Để truyền dữ liệu thì các bạn sử dụng hàm Serial.print[x]; trong đó x là cái mà các bạn muốn in lên ở bất kì kiểu dữ liệu gì cũng được, rất tiện lợi. Nếu bạn muốn truyền thêm ký tự kết thúc câu [\r]  và ký tự xuống dòng [\n] thì sử dụng Serial.println[x] là được.

Nhận dữ liệu: 

– Nền tảng Arduino đã hỗ trợ người dùng rất nhiều khi đã xây dựng sẵn 1 bộ đệm UART [buffer] có kích cỡ 64byte[Arduino Uno]. Mỗi lần nhận 1 ký tự thì ký tự này sẽ được tự động chuyển vào bộ đệm. Người dùng muốn đọc dữ liệu chỉ cần làm việc với bộ đệm là được. Vậy làm việc với bộ đệm như thế nào? + Kiểm tra bộ đệm: Trước khi thực hiện thao tác đọc và xử lý dữ liệu của thiết bị khác gửi đến thì nên kiểm tra bộ đệm trước. Câu lệnh Serial.available[] sẽ trả về cho các bạn số kí tự [byte] hiện có trong bộ đệm. ==>Bạn sử dụng lệnh: if[Serial.available[]] {đọc và xử lý dữ liệu khi có dữ liệu} + Đọc dữ liệu: Để đọc 1byte từ bộ đệm các bạn sử dụng lệnh Serial.read[]; Tuy nhiên trong thực tế thì hầu hết chúng ta cần đọc 1 chuỗi ký tự. Các bạn có thể đọc từng ký tự, sau đó ghép chúng lại thành 1 chuỗi hoặc sử dụng kiểu dữ liệu String mà Arduino hỗ trợ [lưu ý String chữ S viết hoa]. Lệnh Serial.readString[] sẽ giúp các bạn đọc được tất cả các kí tự có trong bộ đệm.

+ Lưu ý: Bộ đệm UART sẽ mất dữ liệu ngay sau khi các bạn đọc. Vì vậy bạn nên đọc và lưu ra 1 biến và làm việc với biến đó. 

Kiểu String:
Kiểu String trong Arduino giúp cho người dùng thao tác với chuỗi đơn giản hơn với rất nhiều hàm hỗ trợ. Mình giới thiệu 1 số hàm phổ biến mà các bạn thường gặp tại đây. 

1. myString.indexOf[val]: Hàm này sẽ giúp bạn tìm được vị trí của 1 ký tự hoặc 1 chuỗi [val] trong 1 chuỗi khác [myString]. Xem chi tiết tại đây. 
2. myString.toInt[]: Từ trên màn hình Serial Monitor các bạn bấm 168 để gửi đi thì Arduino sẽ nhận được chuỗi “168”, để khôi phục lại thành số 168 thì các bạn sử dụng hàm toInt[]. Xem chi tiết hơn tại đây.
3. substring[]: Trong một chuỗi dữ liệu lớn nhận được thì sẽ có phần dữ liệu nằm trong chuỗi đó mà các bạn cần tách ra để sử dụng. Lúc này hàm substring sẽ là trợ thủ đắc lực cho bạn. Xem chi tiết hơn tại đây.
4. myString.toCharArray[]: Hàm này giúp các bạn chuyển chuỗi ở kiểu String thành 1 mảng kiểu char. Khi làm việc với một số thư viện, người phát triển đã khai báo sẵn các hàm có các tham số kiểu char *, lúc này các bạn có thể truyền vào char * hoặc char array, còn String thì không được chấp nhận, vì vậy việc chuyển đổi kiểu dữ liệu là cần thiết, xem thêm tại đây. Khi chuyển String thành mảng thì các bạn có thể sử dụng thêm hàm length[] để xác định được số lượng phần tử của mảng, xem thêm tại đây. [sau đó nhớ cộng thêm 1 vì sử dụng mảng kiểu char để lưu chuỗi thì cần có ký tự Null sau cùng].


Nếu có thắc mắc gì, các bạn cứ bình luận để thảo luận thêm cho rõ nha.  Chúc các bạn thành công!
Xem thêm:  Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32

Thuong Nguyen

Nắm rõ lý thuyết về chuẩn giao tiếp UART sẽ giúp chúng ta hiểu rõ bản chất và thuận lợi cho thực hiện các dự án sau này…

Chúng ta sẽ cùng tìm hiểu phần lý thuyết trước khi thực hành trên vi điều khiển …

Với thế hệ 9x, lúc máy tính mới ra đời, bạn có để ý máy in, chuột, bàn phím được kết nối với máy tính bằng những đầu nối khổng lồ không? Những đầu nối đấy dùng chuẩn giao tiếp UART mà chúng ta sắp tìm hiểu dưới đây.

Cáp nối RS232

Chuẩn giao tiếp UART là 1 trong những chuẩn giao tiếp thường gặp của vi điều khiển. Nó không được phổ biến bằng giao tiếp USB [được dùng ở các cáp nối của điện thoại hiện nay như Type C, Micro…].

Trong các mạch PCB, chuẩn giao tiếp UART lại rất được ưa chuộng vì tính đơn giản và dễ sử dụng của nó.

Chuẩn giao tiếp USB

Về cơ bản, trong giao tiếp UART, có 2 dây kết nối là RX và TX tương ứng với chức năng nhận dữ liệu và truyền dữ liệu, vì chỉ có 1 dây nên dữ liệu sẽ lần lượt truyền từng bit, từng bit 1, nên nó có kiểu truyền dữ liệu nối tiếp.

Cách truyền dữ liệu nó có thể hiểu đơn giản như sau: từ 1 khung dữ liệu cần truyền, ta sẽ đưa thêm vào đầu và cuối của khung này bit bắt đầu, bit chẵn lẻ [để kiểm tra xem dữ liệu có gửi đủ không], bit kết thúc. Khi đó 1 khung truyền sẽ được hình thành và đưa lên đường dây TX và bắt đầu quá trình truyền nối tiếp.

UART là viết tắt của Universal Asynchronous Receiver / Transmitter. UART hoàn toàn khác biệt với chuẩn giao tiếp SPI hoặc I2C, những chuẩn này chỉ đơn tuần là giao tiếp phần mềm. Mục đích chính của UART là truyền và nhận dữ liệu nối tiếp.

Chuẩn giao tiếp UART sử dụng 2 dây để truyền và nhận dữ liệu giữa các thiết bị:

1. TX [Transmiter] - Dây truyền dữ liệu 2. RX [Receiver] - Dây nhận dữ liệu
Chuẩn giao tiếp UART
Số dây sử dụng 2
Tốc độ Từ 9600 bps -> 115200 bps
Phương thức truyền dữ liệu Không đồng bộ
Kiểu truyền dữ liệu Nối tiếp
Số lượng Master [thiết bị chủ] 1
Số lượng Slave [thiết bị tớ] 1

Cả hai UART cũng phải được cấu hình để truyền và nhận cùng một cấu trúc gói dữ liệu. Nghĩa là khi thiết lập ở vi điều khiển, các cấu hình tốc độ baud phải giống nhau.

Để tiện cho việc phân tích ta gọi UART1 là bên truyền dữ liệu và UART2 là bên nhận dữ liệu.

Các UART sẽ truyền và nhận dữ liệu từ một bus dữ liệu [Data Bus]. Bus dữ liệu được sử dụng để gửi dữ liệu đến UART bởi một thiết bị khác như vi điều khiển. Dữ liệu được chuyển từ bus dữ liệu đến UART 1 ở dạng song song.

Sau khi UART1 nhận dữ liệu song song từ bus dữ liệu, nó sẽ thêm một bit Start, một bit Parity [bit chẵn lẻ] và một bit Stop, tạo ra gói dữ liệu. Tiếp theo, gói dữ liệu được xuất ra nối tiếp từng bit tại chân Tx.

UART 2 đọc gói dữ liệu từng bit tại chân Rx của nó. Sau đó UART 2 chuyển đổi dữ liệu trở lại dạng song song và loại bỏ bit Start, bit Parity bit Stop. Cuối cùng, UART2 chuyển gói dữ liệu song song với bus dữ liệu ở đầu nhận:

Cách truyền dữ liệu của giao tiếp UART

Dữ liệu được truyền trong giao tiếp UART được tổ chức thành các gói [Packets]. Mỗi Packets chứa 1 bit Start, 5 đến 9 bit dữ liệu [tùy thuộc vào UART], 1 bit Parity và 1 hoặc 2 bit Stop.

Khung truyền của giao tiếp UART [Click để phóng to]
Start bit

Đường truyền dữ liệu trong giao tiếp UART thường được giữ ở mức điện áp cao khi nó không truyền dữ liệu.

Để bắt đầu truyền dữ liệu, UART truyền sẽ kéo đường truyền từ mức cao xuống mức thấp trong một chu kỳ đồng hồ.

Khi UART 2  phát hiện sự chuyển đổi điện áp cao xuống thấp, nó bắt đầu đọc các bit trong khung dữ liệu ở tần số của tốc độ truyền [Baud rate].

Khung dữ liệu chứa dữ liệu thực tế đang được truyền. Nó có thể dài từ 5 bit đến 8 bit nếu sử dụng bit Parity [bit chẵn lẻ].

Nếu không sử dụng bit Parity, khung dữ liệu có thể dài 9 bit. Trong hầu hết các trường hợp, dữ liệu được gửi với bit LSB [bit có trọng số thấp nhất] trước tiên.

Trong giao tiếp UART, Bit Parity mô tả tính chẵn hoặc lẻ của một số. bit Parity là một cách để UART 2 cho biết liệu có bất kỳ dữ liệu nào đã thay đổi trong quá trình truyền hay không. Bit có thể bị thay đổi bởi tốc độ truyền không khớp hoặc truyền dữ liệu khoảng cách xa,… Sau khi UART 2 đọc khung dữ liệu, nó sẽ đếm số bit có giá trị là 1 và kiểm tra xem tổng số là số chẵn hay lẻ.

Nếu bit Parity là 0 [chẵn], thì tổng các bit 1 trong khung dữ liệu phải là một số chẵn. Nếu bit Parity là 1 [lẻ], thì tổng các bit 1 trong khung dữ liệu sẽ là một số lẻ. Do đó qua kiểm tra sẽ biết được quá trình truyền dữ liệu có chính xác.

Stop bit

Để báo hiệu sự kết thúc của gói dữ liệu, UART gửi sẽ điều khiển đường truyền dữ liệu từ điện áp thấp đến điện áp cao trong ít nhất hai khoảng thời gian bit.

  • UART truyền nhận dữ liệu song song từ bus dữ liệu: Dữ liệu sẽ là song song ở đầu vào. Sau đó sẽ được chuyển thành nối tiếp để truyền trên dây TX. Tốc độ baud thiết lập từ trước ở phần cấu hình.
Đầu vào của UART [truyền song song]
  • UART truyền thêm bit bắt đầu, bit chẵn lẻ và [các] bit dừng vào khung dữ liệu:
Đưa thêm các bit điều kiện vào khung truyền

Trong quá trình này sẽ thực hiện việc đưa thêm các thành phần Start bit, Parity bit và Stop bit vào khung truyền để chuẩn bị cho việc truyền dữ liệu.

  • Toàn bộ gói tin được gửi nối tiếp từ UART truyền đến UART nhận. UART nhận lấy mẫu đường dữ liệu ở tốc độ truyền được định cấu hình trước:
Quá trình truyền dữ liệu trong giao tiếp UART [Click to zoom]

Trong quá trình này các bit trong khung truyền lần lượt được đẩy lên đường dây TX của UART1 [truyền] và đưa tới dây RX của UART2 [nhận].

  • UART nhận loại bỏ bit bắt đầu, bit chẵn lẻ và bit dừng khỏi khung dữ liệu:
Loại bỏ các bit điều kiện trong khung truyền

Quá trình này sẽ bỏ các bit điều kiện đi, sau đó chỉ còn Data Frame [khung dữ liệu]. Cuối cùng dữ liệu cần truyền sẽ tiếp tục được xử lý trong Slave [thiết bị tớ].

  • UART nhận chuyển đổi dữ liệu nối tiếp trở lại thành song song và chuyển nó đến data Bus
Chuyển dữ liệu nối tiếp trở lại song song

Lúc này việc truyền dữ liệu qua giao tiếp UART đã hoàn thành

Không có giao thức truyền thông nào là hoàn hảo, nhưng UART thực hiện khá tốt công việc của chúng. Dưới đây là một số ưu và nhược điểm của chuẩn giao tiếp UART. Mong rằng chúng có thể hỗ trợ cho dự án của bạn.

3.1 Ưu điểm

  • Chỉ sử dụng hai dây
  • Không cần tín hiệu đồng hồ
  • Có một bit chẵn lẻ để cho phép kiểm tra lỗi
  • Cấu trúc của gói dữ liệu có thể được thay đổi
  • Phương pháp được ghi chép rõ ràng và được sử dụng rộng rãi

3.2 Nhược điểm

  • Kích thước của khung dữ liệu được giới hạn tối đa là 9 bit
  • Không hỗ trợ nhiều hệ thống phụ hoặc nhiều hệ thống chính
  • Tốc độ truyền của mỗi UART phải nằm trong khoảng 10% của nhau

Ta đã cùng nhau tìm hiểu cơ bản về lý thuyết của chuẩn giao tiếp UART, đây là 1 khởi đầu tốt đẹp trước khi bắt đầu thực hành. Kiến thức về giao tiếp UART được tóm tắt lại như sau:

    • Chỉ sử dụng 2 dây TX và RX
    • Giao tiếp UART có kiểu truyền dữ liệu nối tiếp [trên 1 dây TX]
    • Phương thức truyền không đồng bộ [do không cần tín hiệu đồng hồ]
    • Ngoài dữ liệu ra trong 1 lần truyền còn nhét thêm các Start bit, Stop bit, Parity bit. Các bit thêm vào này giúp cho Slave nhận biết, kiểm tra và nhận được đúng tín hiệu.

Việc tìm hiểu các chuẩn giao tiếp thường gặp khác lúc này sẽ trở nên rất dễ dàng. Bạn có thể đọc thêm các chuẩn giao tiếp khác:

Video liên quan

Chủ Đề