Xử lý chuỗi trong Arduino

Giới thiệu

Ngôn ngữ lập trình Arduino được xây dựng dựa trên ngôn ngữ C, điều đó có nghĩa là bạn có thể sử dụng các thư viện của ngôn ngữ C một cách dễ dàng cho việc lập trình. Trong đó có thư viện string.h để làm việc với chuỗi. Ngoải ra, Arduino còn hỗ trợ cả đối tượng  String của C++. Hãy khám phá ngay!

Chuỗi là gì?

Chuỗi là một tập liên tiếp các ký tự. Ví dụ: "a bc  ", "123",... Các ký tự được phép sử dùng trong chuỗi của ngôn ngữ Arduino là gì?

Khai báo chuỗi trong Arduino

Các bạn có 2 cách:

  • Như định nghĩa "Chuỗi là gì?" ở trên, ta có thể định nghĩa chuỗi là một mảng ký tự. Cách này tiết kiệm bộ nhớ hơn, nhưng đòi hỏi bạn phải linh động trong việc sử dụng các hàm trong thư viện string.h của ngôn ngữ C. Nhưng về cơ bản, theo mình nghĩ, thì nó chỉ hơi lạ so với việc khai báo một kiểu số nguyên hay số thực mà thôi.
  • Sử dụng đối tượng String, cái này dễ hơn so với cách 1, nhưng yêu cầu nhiều bộ nhớ như vậy việc sử dụng chuỗi trên những bé vi điều khiển có dung lượng bộ nhớ flash nhỏ như ATTiny13 là điều không thể!

Trong phạm vi bài viết ngày hôm nay, mình chỉ giới thiệu về cách dùng chuỗi theo định nghĩa, còn cách sử dụng đối tượng String, bạn có thể vào thư viện để tham khảo rõ ràng hơn!

Những thao tác trên chuỗi cơ bản mà bạn cần biết

Có 3 thao tác trên chuỗi ký tự mà bạn cần nắm:  gán, nốicắt chuỗi.

1. Gán

Để gán một chuỗi ký tự cho một biến chuỗi, chúng ta có 2 trường hợp:

  • Khi khai báo biến chuỗi, ta đồng thời gán cho nó một chuỗi hằng luôn. Việc này rất đơn giản và đã được đề cập đến trong bài viết về chuỗi ký tự. Nếu bạn chưa biết, có thể tham khảo tại đây.
  • Sau khi khai báo một chuỗi (có thể là chuỗi này chưa được gán giá trị như ở bước 1. Ví dụ: char c[10];) thì ta phải sử dụng hàm strcpy như trong ví dụ dưới đây.
#include <string.h>
char a[100] = "abc"; // Gán giá trị cho chuỗi a là "abc"
char b[] = "Arduino.VN - Cong dong Arduino Viet Nam";
void setup() {
  Serial.begin(9600);
  Serial.println(a);
  strcpy(a, "arduino.vn"); // Gán chuỗi a có giá trị là "arduino.vn"
  Serial.println(a);
  strcpy(a, b); // Gán chuỗi a có giá trị là chuỗi b
  Serial.println(a);
}
void loop() {
}

Kết quả trên Serial Monitor sẽ là

Cấu trúc hàm strcpy

strcpy(biến chuỗi cần được gán, giá trị chuỗi hoặc biến chuỗi);

Lưu ý: Không gian lưu trữ ở biến chuỗi cần được gán cần phải có đủ "dung lượng" (độ dài) để lưu giá trị chuỗi hoặc biến chuỗi.

Trong ví dụ trên, chuỗi a có độ dài tối đa là  99. Vì ký tự thứ 100 là ký tự cầm cân (null) ! Như vậy, nó đủ khả năng để lưu trữ các biến chuỗi!

2. Nối chuỗi

Không như các ngôn ngữ lập trình sử dụng các trình thông dịch, ngôn ngữ lập trình dùng trình biên dịch, như C hay Arduino đòi hỏi bạn bạn phải dụng hàm cho việc nối chuỗi. Và đó là hàm strcat

#include <string.h>

char b[] = " - Cong dong Arduino Viet Nam";
void setup() {
  Serial.begin(9600);
  char a[100] = "arduino.vn"; // Gán giá trị cho chuỗi a là "arduino.vn"
  Serial.println(a);
  strcat(a, b); // nỗi chuỗi b vào sau chuỗi a
  Serial.println(a);
}
void loop() {
}

Cấu trúc hàm strcat

strcpy(biến chuỗi cần được nối, giá trị chuỗi hoặc biến chuỗi);

Lưu ý: Không gian lưu trữ ở biến chuỗi cần được nối cần phải có đủ "dung lượng" (độ dài) để lưu  thêm giá trị chuỗi hoặc biến chuỗi.

3. Cắt chuỗi

Có thể xem đây là thủ thuật quan trọng nhất trong việc xử lý chuỗi, vì với nó, bạn có thể xử lý mọi thao tác trên chuỗi devil (trừ việc so sánh chuỗi nhé hehe).

Hãy xem ví dụ sau đây, trên từng dòng code mình có mô tả về ý nghĩa của hàm và cách ứng biến để xử dụng nó!

#include <string.h>
char a[100] = "Arduino.VN";
char b[] = " - Cong dong Arduino Viet Nam";
void setup() {
  Serial.begin(9600);
  Serial.println(a); // In ra chuoi A chua duoc bien doi
  strncpy(a, b + 3, 26); // gán vào chuỗi a là chuỗi được cắt từ vị trí thứ 3 lấy 26 ký tự tiếp theo của chuỗi b. Ở chỗ này, ta có thể đặt vượt độ dài có thể lấy của chuỗi, bạn hãy thử thay số 26 bằng số 50 thử xem
  a[26] = '\0'; // phải có dòng này nhé, để ngôn ngữ Arduino xem đây là một chuỗi, thay vì là một mảng ký tự
  Serial.println(a); // In ra chuoi "Cong dong Arduino Viet Nam"  
  strncpy(a, b + 3, 17);// tương tự như trên nhưng chỉ lấy 17 ký tự sau đó
  a[17] = '\0';
  Serial.println(a); // In ra chuoi "Cong dong Arduino"
}
void loop() {
}

Kết luận

Bây giờ, bạn có thể thao tác trên chuỗi, gần như bạn có thể làm mọi thông báo và xây dựng các câu lệnh (command) và truyên nó qua Serial.

Hãy sáng tạo hơn nhé hehe!

lên
10 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Điều khiển bật tắt đèn LED từ xa thông qua NodeJS và WebSocket với thư viện SocketIO

Với bài viết của bạn Tống Quốc Thái rất hay, bạn Thái đã chọn một con đường mới là IOT với NodeJS. Hôm nay, là mình xin mở rộng bài này cho các bạn yêu thích. Mục tiêu của bài viết này là "điều khiển một bóng LED từ xa qua Webserver đơn giản". Bạn sẽ học được cách tạo một webserver đơn giản cùng với đó là viết một trang web để điều khiển bé LED của mình trên board mạch Arduino.

lên
7 thành viên đã đánh giá bài viết này hữu ích.

Kết nối điều khiển từ xa sử dụng ESP8266 và Arduino với hệ thống firmware iNut Cảm biến CloudMQTT - 1000 firmware miễn phí

Chuyện kể rằng, có 02 sinh viên Việt Nam, trong lúc làm đồ án đại học kết nối điều khiển từ xa qua Internet. Một người thì chọn phương án truyền thống sử dụng máy tính làm máy chủ và demo các tính năng theo yêu cầu đồ án. Người còn lại biết đến iNut Sensor và tìm cách tối ưu hóa phần mềm và phần cứng nhằm chau chuốt cho đồ án của mình trở nên "xịn" và "nhiều tính năng bá đạo". Đến lúc bảo vệ đồ án, cậu sinh viên 01 cảm thấy choáng ván với muôn vàn vấn đề từ việc nơi trình bày đồ án không có wifi, mạng chập chờn, máy tính mở không lên, đứt cáp biển,... Cuối cùng cũng bảo vệ được với điểm số không ưng ý lắm dù tốn rất nhiều thời gian và công sức. Cậu còn lại nhờ vào việc chau chuốt phần mềm, tối ưu hóa và comment kĩ từng lệnh trong dòng code, viết báo cáo bài bản chuẩn bị slide như ý, dùng điện thoại cài wifi, quét mã QRcode để chia sẻ quyền truy cập đến phần mềm rất chuyên nghiệp, mọi thứ cậu chủ động hoàn toàn mà không bị các vấn đề "học tài thi phận" bủa vây mà kết quả hết sức mĩ mãn, điểm số mĩ miều, kiến thức IoT được chuẩn hóa. Thực vậy, các dự án, đồ án sử dụng nền tảng iNut Platform bên dưới cho phép các bạn sinh viên làm các dự án hết sức hoàn hảo: từ xe điều khiển, bãi giữ xe thông minh, hệ thống máy lạnh, máy bơm, điều hòa thông minh,... do chinh các bạn tự làm nên đã đạt được những điểm số tốt và tuyệt đối. Cũng chính vì thế, iNut JSC (công ty chủ quản của iNut Platform) đã kết hợp với Khu Công nghệ phần mềm - ĐHQGHCM để tổ chức những khóa đào tạo ngắn hạn cho sinh viên Việt Nam sử dụng nền tảng IoT do iNut JSC phát triển. Và để mở con đường tri thức tiếp cận IoT trong nháy mắt, iNut JSC đã tạo ra một phiên bản firmware trị giá 50.000 đồng sử dụng clouding của CloudMQTT và tài trợ 1000 firmware cho tất cả các bạn học sinh, sinh viên Việt Nam có thể tiếp cận IoT một cách dễ dàng và nhanh chóng nhất!

lên
14 thành viên đã đánh giá bài viết này hữu ích.