มีหลายวิธีในการเขียนโปรโตคอลอนุกรมขึ้นอยู่กับฟังก์ชันการทำงานที่คุณอาจต้องการและการตรวจสอบข้อผิดพลาดที่คุณต้องการ
สิ่งทั่วไปบางอย่างที่คุณเห็นในโปรโตคอลจุดต่อจุดคือ:
ท้ายข้อความ
โพรโทคอล ASCII ที่ง่ายที่สุดเพียงแค่มีลำดับของอักขระข้อความสิ้นสุดบ่อยครั้ง\r
หรือ\n
อย่างนี้คือสิ่งที่ได้รับการพิมพ์เมื่อกดปุ่ม Enter โปรโตคอลไบนารี่อาจใช้0x03
หรือบางไบต์ทั่วไปอื่น ๆ
เริ่มต้นของข้อความ
ปัญหาที่เกิดขึ้นเมื่อสิ้นสุดข้อความคือคุณไม่ทราบว่ามีไบต์อื่นที่ได้รับเมื่อคุณส่งข้อความ ไบต์เหล่านี้จะถูกนำหน้าไปยังข้อความและทำให้ถูกตีความผิด ตัวอย่างเช่นหาก Arduino เพิ่งตื่นจากการสลีปอาจมีขยะในบัฟเฟอร์อนุกรม ในการหลีกเลี่ยงปัญหานี้คุณจะต้องเริ่มต้นลำดับข้อความ ในตัวอย่างของคุณ^
, ในโปรโตคอลเลขฐานสองมักจะ0x02
ตรวจสอบข้อผิดพลาด
หากข้อความอาจเสียหายเราจำเป็นต้องตรวจสอบข้อผิดพลาด นี่อาจเป็น checksum หรือข้อผิดพลาด CRC หรืออย่างอื่น
ตัวละครหนี
อาจเป็นได้ว่าการตรวจสอบเพิ่มไปยังตัวควบคุมเช่นไบต์ 'เริ่มต้นของข้อความ' หรือ 'สิ้นสุดข้อความ' หรือข้อความที่มีค่าเท่ากับตัวควบคุม ทางออกคือการแนะนำตัวละครหนี อักขระเลี่ยงถูกวางไว้ก่อนอักขระควบคุมที่แก้ไขเพื่อให้ไม่มีอักขระควบคุมจริง เช่นถ้าอักขระเริ่มต้นคือ 0x02 โดยใช้อักขระเลี่ยง 0x10 เราสามารถส่งค่า 0x02 ในข้อความเป็นคู่ไบต์ 0x10 0x12 (อักขระควบคุมไบต์ XOR)
หมายเลขแพ็คเก็ต
หากข้อความเกิดความเสียหายเราสามารถขอให้ส่งอีกครั้งด้วยข้อความที่ขาดหรือลองใหม่ แต่ถ้ามีหลายข้อความที่ถูกส่งไปแล้วข้อความล่าสุดเท่านั้นที่สามารถส่งได้อีก แต่จะได้รับหมายเลขที่ห่อหุ้มแทนข้อความจำนวนหนึ่ง ตัวอย่างเช่นหากหมายเลขนี้คือ 16 อุปกรณ์ส่งสัญญาณสามารถจัดเก็บข้อความ 16 ข้อความสุดท้ายที่ส่งและหากมีความเสียหายอุปกรณ์ที่รับสามารถร้องขอการส่งซ้ำโดยใช้หมายเลขแพ็คเก็ต
ความยาว
บ่อยครั้งในโปรโตคอลไบนารี่คุณจะเห็นไบต์ยาวที่บอกอุปกรณ์ที่รับว่ามีกี่ตัวอักษรในข้อความ นี่เป็นการเพิ่มการตรวจสอบข้อผิดพลาดอีกระดับราวกับว่าไม่ได้รับจำนวนไบต์ที่ถูกต้องแสดงว่ามีข้อผิดพลาด
Arduino เฉพาะ
เมื่อมากับโปรโตคอลสำหรับ Arduino การพิจารณาอันดับแรกคือความน่าเชื่อถือของช่องทางการสื่อสาร หากคุณกำลังส่งผ่านสื่อไร้สายส่วนใหญ่ XBee, WiFi และอื่น ๆ มีการตรวจสอบข้อผิดพลาดและลองใหม่แล้วจึงไม่มีจุดในการวางสิ่งเหล่านี้ในโปรโตคอลของคุณ หากคุณกำลังส่งผ่าน RS422 สองสามกิโลเมตรจะมีความจำเป็น สิ่งที่ฉันจะรวมคือจุดเริ่มต้นของข้อความและจุดสิ้นสุดของข้อความตามที่คุณมี การนำไปใช้โดยทั่วไปของฉันดูเหมือนว่า:
>messageType,data1,data2,…,dataN\n
การแบ่งส่วนข้อมูลด้วยเครื่องหมายจุลภาคช่วยให้การแยกวิเคราะห์ง่ายและข้อความจะถูกส่งโดยใช้ ASCII โปรโตคอล ASCII นั้นยอดเยี่ยมเพราะคุณสามารถพิมพ์ข้อความลงในมอนิเตอร์แบบอนุกรม
หากคุณต้องการโปรโตคอลไบนารีอาจจะทำให้ขนาดข้อความสั้นลงคุณจะต้องใช้การหลบหนีหากข้อมูลไบต์สามารถเหมือนกับไบต์ควบคุม อักขระควบคุมไบนารีจะดีกว่าสำหรับระบบที่ต้องการตรวจสอบข้อผิดพลาดและลองใหม่อย่างเต็มรูปแบบ เพย์โหลดยังสามารถเป็น ASCII ได้ถ้าต้องการ