Truyền nhận dữ liệu với giao tiếp Serial (UART) trên Arduino

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 rất phổ biến 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.

Khai báo UART

Có hai cách để khai báo sử dụng UART trên Arduino, nhưng phổ biến nhất là sử dụng lệnh 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 kiểm tra chẵn lẻ, 1 bit kết thúc). Đồ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 và chân digital 1 được nối với bộ truyền dữ liệu.

Nối dây 2 thiết bị

Nếu 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 cable USB vào là được.

Nếu bạn sử dụng Arduino để giao tiếp với một thiết bị hoặc module khác, bạn cần nối chéo TX – RX và RX – TX. Đồng thời, hãy kiểm tra xem hai thiết bị đã chung chân GND chưa, vì nếu không, chúng sẽ không hiểu mức logic của nhau và không thể giao tiếp được. Nếu hai thiết bị có mức logic khác nhau, ví dụ như một thiết bị 5V giao tiếp với một thiết bị 3.3V, bạn cần sử dụng các mạch chuyển đổi điện áp để đảm bảo tương thích.

Truyền dữ liệu

Để truyền dữ liệu, bạn sử dụng hàm Serial.print(x), trong đó x có thể là bất kỳ kiểu dữ liệu nào. 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), hãy sử dụng Serial.println(x).

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 một bộ đệm UART (buffer) có kích cỡ 64 byte (Arduino Uno). Mỗi lần nhận một ký tự, ký tự này sẽ được tự động chuyển vào bộ đệm. Để đọc dữ liệu, bạn có thể làm việc với bộ đệm bằng cách sử dụng các lệnh sau:

  • Kiểm tra bộ đệm: Trước khi thực hiện thao tác đọc và xử lý dữ liệu từ thiết bị khác, hãy kiểm tra bộ đệm trước. Lệnh Serial.available() sẽ trả về số ký tự hiện có trong bộ đệm. Bạn có thể 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 một byte từ bộ đệm, bạn sử dụng lệnh Serial.read(). Tuy nhiên, hầu hết chúng ta thường cần đọc một chuỗi ký tự. Bạn có thể đọc từng ký tự rồi ghép chúng thành một chuỗi, hoặc sử dụng kiểu dữ liệu String mà Arduino hỗ trợ. Lệnh Serial.readString() sẽ giúp bạn đọc tất cả các ký tự trong bộ đệm.

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

Kiểu String

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

  1. myString.indexOf(val): Hàm này giúp bạn tìm vị trí của một ký tự hoặc một chuỗi (val) trong một chuỗi khác (myString).

  2. myString.toInt(): Khi bạn gửi chuỗi “168” từ Serial Monitor, Arduino sẽ nhận được chuỗi này. Để chuyển đổi thành số 168, bạn sử dụng hàm toInt().

  3. substring(): Trong một chuỗi dữ liệu lớn, có thể có một phần dữ liệu mà bạn cần tách ra để sử dụng. Lúc này, hàm substring() sẽ giúp bạn.

  4. myString.toCharArray(): Hàm này giúp bạn chuyển đổi chuỗi từ kiểu String thành một mảng kiểu char. Khi làm việc với một số thư viện, bạn cần truyền vào kiểu char * hoặc mảng char, không sử dụng kiểu String. Việc chuyển đổi kiểu dữ liệu này là cần thiết. Khi chuyển đổi String thành mảng, bạn có thể sử dụng hàm length() để xác định số lượng phần tử của mảng (nhớ cộng thêm 1 vì mảng kiểu char cần có ký tự Null để kết thúc).

Nếu có thắc mắc gì, hãy bình luận để thảo luận thêm. Chúc các bạn thành công!

Thuong Nguyen

FEATURED TOPIC