Tiếp tục sau bài LED và bài ADC và các giao tiếp gửi nhận dữ liệu thì việc xử lý chuỗi trong các ứng dụng IOT là vô cùng quan trọng trong quá trình truyền nhận dữ liệu. Mình chia sẻ một số ví dụ để các bạn có thể biết được cách để xử lý chuỗi nhận được từ các thiết bị khác.

Hiển thị chuỗi và dữ liệu

Trong ví dụ này ta sẽ tìm hiểu về cách in ra dữ liệu, chuyển đổi các kiểu dữ liệu sang kiểu chuỗi, nối 2 chuỗi để hiển thị thông tin

/*
  String constructors
  Ví dụ tạo chuỗi và in ra các kiểu dữ liệu chuyển đổi
 
  created 27 July 2010
  modified 30 Aug 2011
  by Tom Igoe
  Hardware Required:
  * TIVA C LaunchPad
  
  This example code is in the public domain.
*/

void setup() {
  // Khai báo cổng COM:
  Serial.begin(9600);
  
  // In ra dòng giới thiệu:
  Serial.println("\n\nString Constructors:");
  Serial.println();
}

void loop() {
  // Sử dụng chuỗi không đổi:
  String stringOne = "Hello String";     
  Serial.println(stringOne);      // In ra dòng "Hello String"

  // Chuyển kiểu dữ liệu từ char sang String:
  stringOne =  String('a');        
  Serial.println(stringOne);       // In "a"

  // Chuyển đổi chuỗi hằng(constant string) sang chuỗi đối tượng(String object) để phục vụ cho nối chuỗi:
  String stringTwo =  String("This is a string");  
  Serial.println(stringTwo);      // In ra "This is a string"

  // Nối 2 chuỗi:
  stringOne =  String(stringTwo + " with more"); 
  // In ra dòng "This is a string with more":
  Serial.println(stringOne);      

  // Sử dụng số nguyên ko đổi:
  stringOne =  String(13);        
  Serial.println(stringOne);      // In "13"
  
  // In giá trị dưới dạng số thập phân
  stringOne =  String(analogRead(A0), DEC);  
  // In ra giá trị ADC hiện có đọc được từ chân A0
  Serial.println(stringOne);      
  
  // In giá trị dưới dạng số HEX
  stringOne =  String(45, HEX);   
  // In ra giá trị "2d", tương ứng với số thập phân là 45:
  Serial.println(stringOne);      

  // In giá trị dưới dạng số nhị phân
  stringOne =  String(255, BIN);  
  // In ra "11111111" tương ứng với số thập phân 255
  Serial.println(stringOne);      

  // In thời gian
  stringOne =  String(millis(), DEC);
  // In giá trị hiện tại lấy từ hàm millis(): 
  Serial.println(stringOne);      

  while(true);

}

Cắt chuỗi

Ví dụ này dùng để cắt các dữ liệu thừa không cần thiết

/*
  Ví dụ về cắt chuỗi
 
  created 27 July 2010
  by Tom Igoe
  Hardware Required:
  * TIVA C LaunchPad
 
  This example code is in the public domain.
*/

void setup() {
  Serial.begin(9600);
  Serial.println("\n\nString  substring():");
}

void loop() {
  // Khai báo chuỗi
  String stringOne = "Content-Type: text/html";
  String stringTwo;
  
  Serial.println(stringOne);

  // Cắt chuỗi chỉ lấy chuỗi từ vị trí 19 trở đi, kết quả là html
  stringTwo = stringOne.substring(19);
  Serial.println(stringTwo);

  // Cắt chuỗi chỉ lấy chuỗi từ vị trí từ 14 tới 18 kết quả là text
  stringTwo = stringOne.substring(14,18);
  Serial.println(stringTwo);

  while(true);
}

So sánh chuỗi

Ở ví dụ này chúng ta sẽ làm quen với các cách so sánh chuỗi khác nhau, so sánh chuỗi với số, chuỗi với chuỗi,..

/*
  So sánh chuỗi
 
  created 27 July 2010
  modified 2 Apr 2012
  by Tom Igoe
  
  Hardware Required:
  * Tiva C LaunchPad
 
  This example code is in the public domain.
*/

String stringOne, stringTwo;

void setup() {
  // Cấu hình cổng serial
  Serial.begin(9600);

  stringOne = String("this");
  stringTwo = String("that");
  // In thông báo intro
  Serial.println("\n\nComparing Strings:");
  Serial.println();

}

void loop() {
  // So sánh chuỗi 1 với this nếu bằng thì in ra kết quả
  if (stringOne == "this") {
    Serial.println("StringOne == \"this\""); 
  }
  // So sánh chuỗi 1 và chuỗi 2 nếu khác nhau thì in ra kết quả
  if (stringOne != stringTwo) {
    Serial.println(stringOne + " =! " + stringTwo);
  }

  // So sánh 2 chuỗi khác nhau 1 ký tự in hoa
  stringOne = "This";
  stringTwo = "this";
  if (stringOne != stringTwo) {
    Serial.println(stringOne + " =! " + stringTwo);
  }
  // Cách so sánh khác sử dụng equals()
  if (stringOne.equals(stringTwo)) {
    Serial.println(stringOne + " equals " + stringTwo);
  } 
  else {
    Serial.println(stringOne + " does not equal " + stringTwo);
  }

  // So sánh chuỗi bỏ qua ký tự viết hoa, chỉ kiểm tra nội dung
  if (stringOne.equalsIgnoreCase(stringTwo)) {
    Serial.println(stringOne + " equals (ignoring case) " + stringTwo);
  } 
  else {
    Serial.println(stringOne + " does not equal (ignoring case) " + stringTwo);
  }

  // So sánh chuỗi và số
  stringOne = "1";
  int numberOne = 1;
  if (stringOne.toInt() == numberOne) {
    Serial.println(stringOne + " = " + numberOne);
  }

  // So sánh 2 chuỗi lưu giá trị số
  stringOne = "2";
  stringTwo = "1";
  if (stringOne >= stringTwo) {
    Serial.println(stringOne + " >= " + stringTwo);
  }

  // So sánh độ dài chuỗi
  stringOne = String("Brown");
  if (stringOne < "Charles") {
    Serial.println(stringOne + " < Charles"); 
  }

  if (stringOne > "Adams") {
    Serial.println(stringOne + " > Adams"); 
  }

  if (stringOne <= "Browne") {
    Serial.println(stringOne + " <= Browne"); 
  }


  if (stringOne >= "Brow") {
    Serial.println(stringOne + " >= Brow"); 
  }

  // Sử dụng hàm compareTo() để so sánh và sắp xếp chữ theo thứ tự ABC
  stringOne = "Cucumber";
  stringTwo = "Cucuracha";
  if (stringOne.compareTo(stringTwo) < 0 ) {
    Serial.println(stringOne + " comes before " + stringTwo); 
  } 
  else {
    Serial.println(stringOne + " comes after " + stringTwo);    
  }

  delay(10);  

  while (true) {

  }
}

Thay thế chuỗi

Ví dụ này dùng để thay thế, sửa đổi nội dung của chuỗi

/*
  String replace()
 
  created 27 July 2010
  modified 2 Apr 2012
  by Tom Igoe
  Hardware Required:
  * TIVA C LaunchPad
  
  This example code is in the public domain. 
*/

void setup() {
  // Cấu hình Serial:
  Serial.begin(9600);

  // Gửi thông tin intro:
  Serial.println("\n\nString  replace:\n");
  Serial.println();
}

void loop() {
  String stringOne = "<HTML><HEAD><BODY>";
  Serial.println(stringOne);
  // Sử dụng hàm replace() để thay đổi nội dung của chuỗi
  // Đầu tiên tạo chuỗi copy chuỗi hiện có.
  String stringTwo = stringOne;
  // Sau đó thực hiện thay thế < bằng </:
  stringTwo.replace("<", "</");
  // In chuỗi gốc:
  Serial.println("Original string: " + stringOne);
  // Sau đó in chuỗi đã thay đổi:
  Serial.println("Modified string: " + stringTwo);

  // Ngoài ra còn có thể dùng hàm replace() với kí tự:
  String normalString = "bookkeeper";
  Serial.println("normal: " + normalString);
  String leetString = normalString;
  leetString.replace('o', '0');
  leetString.replace('e', '3');
  Serial.println("l33tspeak: " + leetString);

  while(true);
}

Tính độ dài chuỗi

Trong ví dụ này sẽ thực hiện chờ lệnh gửi từ máy tính xuống, đếm chiều dài lệnh gửi là bao nhiêu và in ra giá trị

/*
  String length() 
  Examples of how to use length() in a String. 
  Mở Serial từ máy tính và gõ lệnh để quan sát
 
  created 1 Aug 2010
  by Tom Igoe
  
  Hardware Required:
  * TIVA C LaunchPad
 
  This example code is in the public domain.
*/
String txtMsg = "";                         //Chuỗi lưu giá trị gửi từ máy tính
int lastStringLength = txtMsg.length();     // Độ dài trước đó của  chuỗi

void setup() {
  // Cấu hình serial:
  Serial.begin(9600);
  while (!Serial) {
    ; // Đợi kết nối
  }

  // Gửi intro:
  Serial.println("\n\nString  length():");
  Serial.println();
}

void loop() {
  // Thêm dữ liệu nhận được vào String:
  while (Serial.available() > 0) {
    char inChar = Serial.read();
    txtMsg += inChar;
  } 

  // In ra chiều dài chuỗi nếu có thay đổi
  if (txtMsg.length() != lastStringLength) {
    Serial.println(txtMsg);
    Serial.println(txtMsg.length());
    // Nếu chuỗi có độ dài hơn 140 in thông báo cảnh báo:
    if (txtMsg.length() < 140) {
      Serial.println("That's a perfectly acceptable text message");
    } 
    else {
      Serial.println("That's too long for a text message."); 
    }
    lastStringLength = txtMsg.length();
  }
}

Xuất chữ in hoa và in thường

Ví dụ này thực hiện chuyển toàn bộ chữ hoa thành chữ thường và ngược lại

/*
  Chuyển chuỗi từ chữ hoa sang chữ thường
  created 27 July 2010
  modified 2 Apr 2012
  by Tom Igoe
 
  Hardware Required:
  * TIVA C LaunchPad
 
 This example code is in the public domain.
*/

void setup() {
  // Cấu hình Serial
  Serial.begin(9600);

  // Gửi lệnh intro:
  Serial.println("\n\nString  case changes:");
  Serial.println();
}

void loop() {
  // Biến chữ thường thành chữ hoa:
  String stringOne = "hello";
  Serial.println(stringOne);
  stringOne.toUpperCase();
  Serial.println(stringOne);

  // Biến chữ hoa thành chữ thường 
  String stringTwo = "HELLO";
  Serial.println(stringTwo);
  stringTwo.toLowerCase();
  Serial.println(stringTwo);

  // do nothing while true:
  while(true);
}

Lấy chỉ số index

/*
  In vị trí kí tự trong chuỗi
  
  created 27 July 2010
  modified 2 Apr 2012
  by Tom Igoe
  
  Hardware Required:
  * TIVA C LaunchPad
 
  This example code is in the public domain. 
 */

void setup() {
  // Cấu hình Serial:
  Serial.begin(9600);

  // Gửi intro:
  Serial.println("\n\nString indexOf() and lastIndexOf()  functions:");
  Serial.println();
}

void loop() {
  // Hàm indexOf() sẽ trả lại vị trí của kí tự
  String stringOne = "<HTML><HEAD><BODY>";
  int firstClosingBracket = stringOne.indexOf('>');
  Serial.println("The index of > in the string " + stringOne + " is " + firstClosingBracket);

  stringOne = "<HTML><HEAD><BODY>";
  int secondOpeningBracket = firstClosingBracket + 1;
  int secondClosingBracket = stringOne.indexOf('>', secondOpeningBracket );
  Serial.println("The index of  the second > in the string " + stringOne + " is " + secondClosingBracket);

  // Có thể dùng hàm indexOf() để tìm chuỗi Strings:
  stringOne = "<HTML><HEAD><BODY>";
  int bodyTag = stringOne.indexOf("<BODY>");
  Serial.println("The index of the body tag in the string " + stringOne + " is " + bodyTag);

  stringOne = "<UL><LI>item<LI>item<LI>item</UL>";
  int firstListItem = stringOne.indexOf("<LI>");
  int secondListItem = stringOne.indexOf("item", firstListItem + 1 );
  Serial.println("The index of the second list item in the string " + stringOne + " is " + secondClosingBracket);

  // Hàm lastIndexOf() đưa ra vị trí cuối cùng của kí tự trong chuỗi:
  int lastOpeningBracket = stringOne.lastIndexOf('<');
  Serial.println("The index of the last < in the string " + stringOne + " is " + lastOpeningBracket);

  int lastListItem  = stringOne.lastIndexOf("<LI>");
  Serial.println("The index of the last list item in the string " + stringOne + " is " + lastListItem);


  // Hàm lastIndexOf() cũng có thể dùng để tìm chuỗi:
  stringOne = "<p>Lorem ipsum dolor sit amet</p><p>Ipsem</p><p>Quod</p>";
  int lastParagraph = stringOne.lastIndexOf("<p");
  int secondLastGraf = stringOne.lastIndexOf("<p", lastParagraph - 1);
  Serial.println("The index of the second last paragraph tag " + stringOne + " is " + secondLastGraf);

  while(true);
}

Tạm kết

Thế là đã xong các ví dụ xử lý với chuỗi, thế ứng dụng cụ thể của những cách xử lý này trong một dự án cụ thể thế nào các bạn theo dõi ở các bài tiếp theo nhé