Arduino Splint String
เนื่องจากใน EP2 ที่ผ่านมา เราได้ทำการส่งข้อมูลผ่าน Serial แต่นั้นมันเป็นการส่งแบบค่าเดียว “แต่พอเราจะส่งมาเป็นชุดทีละหลาย ๆ ค่าหล่ะ ? ” จากคำถามที่เกิดขึ้นก็เลยต้องปูทางด้วย EP3 ในหัวข้อ “splint การตัดข้อความดัวยตัวอักขระ” ซึ่งถ้าเราจะทำการส่งค่าผ่าน Serial หรือแม้กระทั้งผ่าน IoT (Internet of Things) สิ่งที่เรามักต้องใช้กันบ่อย ๆ คือคำสั่ง splint ในการตัดชุดข้อความ เนื่อจากเรามักต้องการความรวดเร็วในการส่งข้อมูลเราก็มักจะส่งค่าพร้อม ๆ กันหลาย ๆ ตัวมาในข้อความชุดเดียว เช่น ค่าจาก Sensor ตัวที่ 1 ,2,3,4 อะไรก็แล้วแต่จะออกแบบกัน (คงไม่มีใครอยากวนส่งมาทีล่ะตัวหรอกมั้งเน๊อะ เพราะมันข้า) ก็มักจะส่งมาเป็นชุดเลย แล้วก้คั้นด้วยเครื่องหมายต่าง ๆ เช่น “,” หรือ “/” ก็แล้วแต่จะเลือกใช้กัน เช่น "123,abc,3.14,A0" จากนั้นเราก็ใช้คำสั่ง splint โดยการตัดแยกออกมาเพื่อที่จะนำไปใช้งาน หรือส่งข้อมูลต่อไป สำหรับภาษาอื่น ๆ เช่น Java หรือ Python ก็คงไม่ใช่ปัญหาใหญ่อะไร เพราะมีคำสั่ง splint ให้ใช้กันอยู่แล้ว แต่ใน Arduino มันไม่มีคำสั่ง splint หน่ะสิ เอ้า!! แล้วจะทำยังไง .....ไปดูครับ
หลักการทำงาน
Splint จะเป็นการตัดข้อความออกมาเป็นชุด ๆ จากชุดเดียว ซึ่งการที่เราจะตัดได้เราก็ต้องออกแบบการคั้นข้อความที่เอามาต่อกันเป็นชุดก่อน ถึงจะทำการตัดได้ แต่นั้นไม่ใช้ประเด็นที่เราจะสนใจ เพราะเดี๋ยวค่อยไปพูดถึงกันใน EP ถัดไป แต่ในบทความนี้เราจะเน้นเรื่องตัดโดยเฉพาะ เอาหล่ะฮะสาวกทุกท่าน ไปดูโค๊ดตัวอย่างกันเลยครับ
โค๊ดโปรแกรม
String str = "123,abc,3.14,A0"; // สร้างตัวแปรชื่อ str ชนิด String สำหรับทดสอบการ Splint ด้วยเครื่องหมาย ','
void splint_string(char sz[]){ // สร้างฟังชันต์ชื่อ splint_string กำหนดตัวแปรนำเข้าชื่อ sz ชนิด char แบบอาเรย์
char *p = sz; // สร้างตัวแปรชื่อ p ชนิด Pointer มีค่าเท่ากับ sz
char *str; // สร้างตัวแปรชื่อ str ชนิด Pointer
int counter = 0; // สร้างตัวแปรชื่อ counter ชนิด int สำหรับทำการนับครั้งที่ตัด
while ((str = strtok_r(p, ",", &p)) != NULL){ // วนทำลูป while ซ้ำ โดยเรียกฟังชันต์ strtok_r() โดยทำการตัดค่าใน p เมื่อเจอเครื่องหมาย','
counter++;
Serial.print(counter + String(". ")); // แสดงผลจำนวนครั้งที่ตัด
Serial.println(str); // แสดงผลค่าที่ตัดได้
}
counter = 0; // เคลียร์ค่าใน counter เป็น 0
}
void setup() {
Serial.begin(9600);
char charBuf[100];
str.toCharArray(charBuf, 100); // คัดลอกอักขระของชุดอักขระไปยังตัวแปร charBuf
splint_string(charBuf); // เรียกใช้งานฟังชั่น Splint String
}
void loop() {
}