Serial.available vì sao lúc bằng 2 lúc bằng 1
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. Show Khai báo UART:
Nối dây 2 thiết bị: Truyền dữ liệu: 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: 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
Serial.begin(speed): Tham số:speed: tốc độ giao tiếp. Trả về:không. Để bắt đầu sử dụng được chức năng serial bạn cần phải khởi động nó (nếu không khởi động thì mặc định 2 chân Rx(0) và Tx(1) đảm nhận chức năng nhận tín hiệu logic).
Ngoài ra bạn có thể khởi động serial theo cách nâng cao như sau:
Trong đó SERIAL_8N1 là thiết lập nâng cao, số 8 là số lượng bit được gửi trong một phiên, ký tự tiếp theo cho biết có thực hiện kiểm tra sự đúng đắn của dữ liệu nhận được hay không (N: không kiểm tra, O: kiểm tra lẻ, E: kiểm tra chẵn) số tiếp theo cho biết số bit stop được gửi kèm.
Serial.end():Cú pháp:Serial.end(): Tham số:không. Trả về:không. Trong quá trình hoạt động, nếu ta không muốn giao tiếp này hoạt động thì có thể đóng lại để tiết kiệm năng lượng (rất nhỏ, chỉ phù hợp với thiết bị di động) hoặc để sử dụng 2 chân 0 và 1 vào mục đích khác (trường hợp này rất ít khi gặp).
Serial.available():Cú pháp:Serial.available(). Tham số:không. Trả vềsố byte dữ liệu có trong bộ đệm. Hàm này trả về số byte dữ liệu có trong bộ đệm. Nó thường được dùng để xét xem đã có dữ liệu chưa, hoặc lượng dữ liệu cần nhận đã đủ chưa.
Serial.availableForWrite():Cú pháp: Tham số:không. Kiểu trả vềsố lượng byte còn lại của bộ đệm gửi. Hàm này sẽ trả về số lượng byte còn có thể “nhét” vào bộ đệm để serial gửi đi. Nếu con số này bằng 0 thì không có nghĩa là dữ liệu của bạn sẽ không được gửi đi, arduino sẽ tự tạo thêm một bộ đệm nữa để tiếp tục quá trình gửi nếu còn bộ nhớ. Để tránh trường hợp thiếu bộ nhớ thì bạn bạn phải chờ một khoảng thời gian để serial gửi bớt dữ liệu thì mới “nhét” thêm dữ liệu vào.
Serial.find():Cú pháp:Serial.find(str): Tham số:str: chuỗi cần tìm. Trả về:true nếu tìm thấy chuỗi, false khi không thấy chuỗi hoặc quá thời gian quy định. Hàm này sẽ liên tục đọc bộ đệm cho đến khi gặp được chuỗi cần tìm hoặc quá thời gian quy định. Chính vì việc đọc liên tục như vậy nên tất cả dữ liệu trước chuỗi cần tìm sẽ mất (kể cả chuỗi cần tìm). Ví dụ: bộ đêm đang chứa dữ liệu “abcdefghiklm”, thì sau khi chạy hàm Serial.find(“def”): bộ đêm sẽ còn “ghiklm”.
Serial.findUntil():Cú pháp:Serial.findUntil(str0, str1): Tham số:str0: chuỗi cần tìm. str1: chuỗi kết thúc quá trình tìm. Trả về:true nếu tìm thấy chuỗi, false khi không thấy chuỗi hoặc quá thời gian quy định, hoặc gặp chuỗi kết thúc quá trình tìm. Hàm này sẽ liên tục đọc bộ đệm cho đến khi gặp được chuỗi cần tìm hoặc quá thời gian quy định, hoặc gặp chuỗi kết thúc quá trình tìm. Lưu ý là hàm này sẽ không làm mất chuỗi kết thúc quá trình tìm trong bộ đêm. Ví dụ: bộ đêm đang chứa dữ liệu “abcdefghiklm”, thì sau khi chạy hàm Serial.findUntil(“def”,”ikl”): bộ đệm sẽ còn “ghiklm”, (kết quả tương tự như hàm Serial.find() nhưng thời gian tìm sẽ nhanh hơn). Serial.flush():Cú pháp:Serial.flush(): Tham số:không. Trả về:không. Hàm này có chức năng chờ cho đến khi dữ liệu trong bộ đệm gửi được gửi đi hết. Serial.parseFloat():Cú pháp:Serial.parseFloat(): Tham số:không. Trả về:float. Hàm này có chức năng trả về số thực đầu tiên trong bộ đệm nhận mà nó thấy được, các ký tự để nhận biết số thực gồm các số , “-“, “+” và “.” (lưu ý là không có ký tự “e”, cũng như “E”). Những dữ liệu phía trước số thực tìm được sẽ bị mất, ví dụ: nếu trong bộ đệm có “abcd123.45efghiklm” thì sau khi thực hiện Serial.parseFloat(), bộ đêm sẽ còn “efghiklm”.
Serial.parseInt():Cú pháp:Serial.parseInt(): Tham số:không. Trả về:long. Hàm này có chức năng trả về số nguyên đầu tiên trong bộ đệm nhận mà nó thấy được, các ký tự để nhận biết số thực gồm các số và dấu “-” (lưu ý là không có ký tự “e”, cũng như “E”). Những dữ liệu phía trước số nguyên tìm được sẽ bị mất, ví dụ: nếu trong bộ đệm có “abcd12345efghiklm” thì sau khi thực hiện Serial.parseInt(), bộ đệm sẽ còn “efghiklm”.
Serial.peek():Cú pháp:Serial.peek(): Tham số:không. Trả về:int. Hàm này sẽ trả về byte đầu tiên trong bộ đệm (tương tự như hàm Serial.read()) nhưng không tự xóa byte đó. Vì thế nên bạn không thể đọc được ký tự thứ 2 trở đi nếu cứ dùng hàm này. Serial.write();Cú pháp: 1. Serial.write(val); 2. Serial.write(str); 3. Serial.write(buf, len); |