सीरियल प्रोटोकॉल लिखने के लिए बहुत सारे तरीके हैं जो इस बात पर निर्भर करता है कि आप क्या कार्यक्षमता चाहते हैं और आपको कितनी त्रुटि की आवश्यकता है।
पॉइंट टू पॉइंट प्रोटोकॉल में दिखाई देने वाली कुछ सामान्य चीजें हैं:
संदेश का अंत
सबसे सरल ASCII प्रोटोकॉल में केवल संदेश चरित्र अनुक्रम का अंत होता है, अक्सर \r
या \n
जैसा कि एंटर कुंजी के हिट होने पर मुद्रित होता है। बाइनरी प्रोटोकॉल का उपयोग 0x03
या कुछ अन्य सामान्य बाइट हो सकता है ।
संदेश की शुरुआत
केवल संदेश के अंत के साथ समस्या यह है कि आपको पता नहीं है कि जब आप अपना संदेश भेजते हैं तो अन्य बाइट्स पहले से ही प्राप्त कर चुके हैं। इन बाइट्स को तब संदेश के लिए उपसर्ग किया जाएगा और इसका कारण गलत तरीके से समझा जाएगा। उदाहरण के लिए, अगर Arduino सिर्फ नींद से जागता है तो सीरियल बफर में कुछ कचरा हो सकता है। इसके चारों ओर जाने के लिए आपके पास संदेश अनुक्रम की शुरुआत है। आपके उदाहरण में ^
, बाइनरी प्रोटोकॉल में अक्सर0x02
त्रुटि की जांच कर रहा है
यदि संदेश दूषित हो सकता है तो हमें कुछ त्रुटि जाँच की आवश्यकता है। यह एक चेकसम या सीआरसी त्रुटि या कुछ और हो सकता है।
वर्ण से बचो
यह हो सकता है कि चेकसम एक नियंत्रण वर्ण में जोड़ता है, जैसे 'संदेश की शुरुआत' या 'संदेश का अंत' बाइट, या संदेश में नियंत्रण वर्ण के बराबर मान होता है। समाधान एक भागने चरित्र को पेश करना है। बच चरित्र को एक संशोधित नियंत्रण चरित्र से पहले रखा जाता है ताकि वास्तविक नियंत्रण चरित्र मौजूद न हो। उदाहरण के लिए, यदि कोई प्रारंभ वर्ण 0x02 है, तो भागने वाले वर्ण 0x10 का उपयोग करके हम संदेश में 0x02 का मान बाइट जोड़ी 0x10 0x12 (बाइट XOR नियंत्रण वर्ण) के रूप में भेज सकते हैं
पैकेट नंबर
यदि कोई संदेश दूषित है, तो हम एक नीक या पुनः प्रयास संदेश के साथ पुनः भेजने का अनुरोध कर सकते हैं, लेकिन यदि एक से अधिक संदेश भेजे गए हैं, तो केवल नवीनतम संदेश ही नाराज हो सकता है। इसके बजाय पैकेट को एक नंबर दिया जा सकता है जो एक निश्चित संख्या में संदेशों के बाद खत्म हो जाता है। उदाहरण के लिए, यदि यह संख्या 16 है, तो ट्रांसमिटिंग डिवाइस अंतिम 16 संदेशों को भेज सकता है और यदि कोई प्राप्त डिवाइस को दूषित कर रहा है तो वह पैकेट नंबर का उपयोग करके रिस्टेंड का अनुरोध कर सकता है।
लंबाई
अक्सर बाइनरी प्रोटोकॉल में आप एक लंबाई बाइट देखते हैं जो प्राप्त डिवाइस को बताता है कि संदेश में कितने वर्ण हैं। यह त्रुटि जांच का एक और स्तर जोड़ता है जैसे कि बाइट्स की सही संख्या प्राप्त नहीं हुई थी तो एक त्रुटि थी।
Arduino विशिष्ट
Arduino के लिए एक प्रोटोकॉल के साथ आने पर पहला विचार यह है कि संचार चैनल कितना विश्वसनीय है। यदि आप अधिकांश वायरलेस माध्यमों, XBee, WiFi, आदि पर भेज रहे हैं, तो पहले से ही त्रुटि जाँच और पुनः प्रयास में बनाया गया है और इस प्रकार आपके प्रोटोकॉल में इन्हें डालने का कोई मतलब नहीं है। यदि आप एक दो किलोमीटर के लिए RS422 पर भेज रहे हैं तो यह आवश्यक होगा। जिन चीजों को मैं शामिल करूंगा उनमें संदेश की शुरुआत और संदेश पात्रों का अंत है, जैसा कि आपके पास है। मेरा विशिष्ट कार्यान्वयन कुछ इस तरह दिखता है:
>messageType,data1,data2,…,dataN\n
अल्पविराम के साथ डेटा भागों को वितरित करना आसान पार्सिंग की अनुमति देता है, और संदेश ASCII का उपयोग करके भेजा जाता है। ASCII प्रोटोकॉल महान हैं क्योंकि आप धारावाहिक मॉनिटर में संदेश टाइप कर सकते हैं।
यदि आप एक बाइनरी प्रोटोकॉल चाहते हैं, तो शायद संदेश के आकार को छोटा करने के लिए, आपको भागने को लागू करना होगा यदि एक डेटा बाइट एक नियंत्रण बाइट के समान हो सकता है। बाइनरी नियंत्रण वर्ण उन प्रणालियों के लिए बेहतर हैं जहां त्रुटि जाँच और पुनर्प्रयास का पूर्ण स्पेक्ट्रम वांछित है। यदि वांछित है तो पेलोड अभी भी ASCII हो सकता है।