State Machine เหมาะกับเอามาใช้กับข้อมูลแบบ Stream ที่เรารู้รูปแบบของข้อมูลที่แน่นอนครับ ซึ่ง Serial Port ก็เป็นข้อมูลแบบ Stream ด้วย
โจทย์คือ เราจะรับข้อมูลแบบ stream ในรูปแบบ <XXXXXX> โดยที่
< คือไบต์เริ่มต้น หรือ Header
> คือไบต์สิ้นสุด หรือ Footer
XXXXX คือข้อความ
การเริ่มตอนออกแบบ State Machine เพื่อให้เห็นภาพง่ายๆ ควรเริ่มจากการวาดรูปแผนภาพ
ภาพที่ 1
จากโจทย์ข้างบนวาดออกมาเป็นแผนภาพ State Machine ได้ตามภาพที่ 1 ครับโดยเริ่มจาก state [1] โปรแกรมจะรอจนกระทั่งได้รับ '<'
เมื่อโปรแกรมได้รับ '<' โปรแกรมจะกระโดดไปยัง state [2] คือรับ text แต่ถ้า state [2] ได้รับ '<' อีกครับโปรแกรมจะไปทำ [3] คือลบข้อมูล text ที่รับมาทั้งหมดเพราะถือว่าไม่ตรงตามโปรโตคอล เมื่ออยู่ที่ state [3] แล้วได้รับ text ทุกตัวที่ไม่ใช่ '<' หรือ '>' จะไปที่ state [2] เมื่ออยู่ที่ state [2] แล้วได้รับ '>' คือจบ โปรแกรมจะ print text ที่ได้รับออกมาแล้วจากนั้นจะไปที่ state [1]
มาลองดูโปรแกรมกันครับ
โปรแกรมจะมี State แบ่งเป็น 3 State คือ STATE_1, STATE_2, STATE_3 โดยจะเก็บอยู่ในตัวแปลชื่อ STATE เมื่อได้รับข้อมูลจาก Serial Port โปรแกรมจะเข้าไปทำงานที่ function process_serial ใน function จะใช้ Switch ในการจัดการ State ซึ่งแต่ละ State ก็ทำงานตามภาพที่ 1 ครับ (ไม่เชื่อลองไล่ Code ดูครับ :p)
ลองเทสโปรแกรมดูครับเอามือรูดคีบอร์ดได้เลย
ปล.ว่าจะเขียนนานแล้ว เพิ่งมีเวลาว่าง
ปล2.เห็นหลายคนใช้ sub string ดูแล้วมันเหนื่อย แล้วก็กินเมม มากๆ
0 ความคิดเห็น:
แสดงความคิดเห็น