ถ้าเราลองพิมแล้วก็กด enter หรือกด send ไป มันก็จะไม่มีอะไรเกิดขึ้น เพราะอะไรหนะหรอ??
เพราะว่าเราไม่ได้เขียนคำสั่งการรับค่าให้กับบอร์ดอาดุยโน่ยังไงหละ
(หน้าจอจะไม่แสดงข้อมูลที่เราส่งไป)
แนวคิด ( concept )
ก่อนอื่นหวังว่าผู้อ่านคงยังจำการสื่อสารแบบอนุกรมได้
![]() |
ลักษณะการสื่อสารแบบแนุกรม |
ถามว่า 1 byte มีนัยยะอะไร??
1 byte คือขนาดของ char ซึ่งตีความได้เป็น 1 ตัวอักษร
นั่นแปลว่า ถ้าเราส่งตัวอักษรหนึ่งตัว จะเป็นข้อมูล 1 byte ขอให้เข้าใจตรงนี้ก่อนนะครับ ต่อไปนี้เราจะพูดในสเกลของ byte แล้ว อย่าสับสนกับ bit นะครับ
แม้จะส่งเป็น byte แต่ลักษณะการส่งก็ยังเหมือนเดิม คือส่งไล่ไปทีละตัว
จะสังเกตเห็นสิ่งที่เพิ่มมา คือ buffer ถามว่า buffer คืออะไร
buffer คือหน่วยที่เก็บข้อมูลไว้ก่อนจะนำมาประมวลผล พูดให้ง่ายก็คือ
สมมติว่า การส่งจดหมายคือการส่งแบบอนุกรม เราส่งจดหมายทีละฉบับ ฉบับละ 1 byte
ซึ่ง จดหมายส่งไปถึงนาย a ซึ่งก็เหมือนไมโครคอนโทรลเลอร์ เมื่อนาย a ยังไม่ว่างอ่าน
นาย a ก็ต้องเก็บจดหมายไว้ก่อน ค่อยอ่านทีหลัง ถ้าไม่เก็บไว้ ก็คงจะพลาดจดหมายบางฉบับไป
ฉะนั้นการที่นาย a เก็บจดหมายไว้ก็คือ buffer
กลับมาที่กล่องจดหมาย เมื่อจดหมายมันมาทีละฉบับ แต่มันไม่ได้บอกไว้ว่าฉบับไหนมาก่อนมาหลัง
![]() |
แสดงการอ่านข้อมุลของบัฟเฟอร์ |
เมื่อมีการอ่านจากอาดุยโน่ซึ่งจะอ่านข้อมูลจากตัวที่เข้ามาก่อนไปหลัง จะเป็นการลบข้อมูลออกจากบัฟเฟอร์ไปในตัว หรือจะมองเป็นการย้ายออกจากบัฟเฟอร์ก็ได้ (นาย a อ่านจดหมายเสร็จแล้วฉีกทิ้งเลย 5555+)
เมื่อเข้าใจคอนเซปแล้ว เราก็จะมาเริ่มการเขียนคำสั่งกัน
โหมดการส่งจาก Serial monitor
No line ending จะส่งเฉพาะข้อมูล ไม่มีอะไรพ่วง
Newline จะส่งข้อมูล ตามด้วย '\n' เช่นเราพิมพ์คำว่า hello แล้วคลิ๊ก Send หรือ กด enter คอมพิวเตอร์จะส่ง 'h' 'e' 'l' 'l' 'o' '\n' ไปที่อาดุยโน่
Carriage return คอมพิวเตอร์จะส่ง '\r' พ่วงท้ายข้อมูล
Both NL & CR คอมพิวเตอร์จะส่ง '\r'และ'\n' พ่วงท้ายข้อมูล
ฟังก์ชัน Serial.available()
ก็ เรียนฟังก์ชันกันมาแล้วเนอะ ก็ขอเรียกให้มันถูกต้องละกัน จริงๆคำว่า Serial.read มันผิดหลักการตั้งชื่อฟังก์ชัน เพราะมันมีเครื่องหมาย (. ) แต่ก็นั่นแหละมันไม่ใช่ฟังก์ชั่นทั่วไป เราจะยังไม่พูดถึงละกัน เอาเป็นว่า เป็นสิ่งที่เขากำหนดมา ให้เรานำไปใช้ได้
ใน Arduino ide จริงๆก็มีโค๊ดสำเร็จรูปอยู่หลายส่วนให้เราเรียกใช้ Serial เองก็เป็นหนึ่งในนั้น
ฟังก์ชัน Serial.available เป็นฟังก์ชันที่มีการส่งคืนค่าในรูปแบบ int และไม่รับค่าเข้า
โดยค่าที่ส่งคืนนั้น เป็นจำนวนของข้อมูลที่ค้างอยู่ในบัฟเฟอร์ หรือก็คือจำนวนจดหมายที่ค้างอ่านนั้นเอง
ข้อระวัง บัฟเฟอร์เอง ก็มีขนาดที่จำกัด ในอาดูยโน่ กำหนดไว้ที่ 64-byte ถ้ามีข้อมูลค้างอ่านเกิดกว่านั้นจะทำให้เกิดความผิดพลาดได้
ตัวอย่าง
สำหรับ delay ใส่ไว้เพื่อให้รอบการแสดงค่าช้าลง ลองเปลี่ยนเลขดี จะเห็นความแตกต่าง
เมื่อเราส่งข้อความไป เราจะเห็นการเปลี่ยนแปลงดังนี้
![]() |
เมื่อส่งคำว่า hello ไป |
สาเหตุที่ต้องใส่การทำงานใน loop เพราะค่าของ Serial.available() สามารถเปลี่ยนแปลงได้ตลอดเวลา จึงต้องทำการแสดงค่าใหม่ตลอดเวลา จะได้เห็นการเปลี่ยนแปลง ในขณะที่ถ้าใส่ใน setup โปรแกรมจะทำงานแค่ครั้งเดียว ทำให้ไม่เห็นการเปลี่ยนแปลง
สำหรับการที่จะทำให้ค่าลดลงได้ ก็คือการอ่านค่าจากบัฟเฟอร์ นั่นก็คือ.....
ฟังก์ชัน Serial.read()
คือฟังก์ชัน ที่มีการส่งคืนค่าประเภท char ซึ่งเป็นค่าข้อมูลในบัฟเฟอร์ที่เข้ามาก่อนตัวอื่นๆ ซึ่งการที่จะใช้ฟังก์ชั่น Serial.read() ได้นั้น จะต้องรอให้มีข้อมูลในบัฟเฟอร์ก่อน (ตรวจสอบด้วย Serial.available() )
เนื่องจากการใช้ Serial.read() จะเป็นการดึงค่าที่เข้ามาในบัฟเฟอร์ เมื่อดึงมาแล้วก็จะลบข้อมูลนั้นทิ้ง ดังนั้น ถ้าเราเรียกฟังก์ชั่นนี้ซ้ำ เราจะไม่ได้ข้อมูลตัวเดิม ถ้าเราต้องการเก้บข้อมูลไว้ประมวลผล จะต้องสร้างตัวแปรขึ้นมาเก็บ ดังตัวอย่าง
![]() |
ตัวอย่างโปรแกรม Serial echo |
ข้อสังเกต
ถ้าเราส่งอะไรไป เราจะได้รับข้อความเดียวกันสะท้อนกลับมา
ถ้าเราตั้งโหมดไม่ให้มีการเติม \n ข้อความของเราจะต่อกันไปเรื่อย
แต่ถ้าให้มีการเติม \n จะมีการแยกบรรทัด ทุกครั้งที่กดส่ง
การประยุกต์ใช้งานเบื้องต้น
เราสามารถใช้ตัวอักษร ที่ส่งเข้ามา เลือกฟังก์ชั่นในการทำงานได้ เช่น
ให้เราลองใส่เลขต่างๆเข้าไปทีละเลข จะเห็นผลต่างๆกัน
ข้อสังเกต
เนื่องจากตัวอักษร 1 ที่ส่งมานั้น มันไม่ได้มีค่าเท่ากับ 1 ในเลขฐาน 10 แต่มันคือ 1 ในรหัสแอสกี้ ซึ่งมีค่าเท่ากับ 49 ในโปรแกรมตัวอย่าง '1' นั้น หมายถึง ค่า 49 ที่เป็นตัวแทนของอักษร 1 เครื่องหมายฟันหนู่เดี่ยว จะเป็นตัวระบุว่า นั่นไม่ใช่ค่า แต่เป็นตัวอักษร นอกจากนี้ ยังสามารถใช้กับตัวอักษรอื่นๆได้ เช่น 'a' 'b' 'c' เป็นต้น ผู้อ่านสามารถออกแบบเงื่อนไขเองได้ว่าจะใช้ตัวอักษรใด
ข้อควรระวัง
ในเครื่องหมาย ' ' สามารถมีตัวอักษรได้เพียงตัวเดียวเท่านั้น (รวมถึงการเว้นวรรค) ยกเว้นตัวอักขระหลีก เช่น '\n' '\r' '\t' เป็นต้น
แบบฝึกหัด
เราสามารถใช้ค่าที่รับจาก Serial ควบคุมหลอดไฟ led pin 13 ได้อย่างไร
ไม่มีความคิดเห็น:
แสดงความคิดเห็น