2009-05-02 25 views
11

पर सी 8 9 में बाइट स्ट्रीम में पैकेट स्ट्रीम में कनवर्ट करने का एक तरीका मैं एक एम्बेडेड डिवाइस पर काम कर रहा हूं जो पीसी से आरएस 232 (यूएसबी पर आरएस 232) का उपयोग कर कनेक्ट है।एक एम्बेडेड डिवाइस

मैं अपने खुद के प्रोटोकॉल विकसित करने के बारे में सोच रहा हूँ:

<MAGIC><LENGTH><BINARY DATA><CRC>

लेकिन मैं पहिया बदलने की नहीं करना चाहती।

कृपया नोट नोट करें: मैं काफी प्रतिबंधित डिवाइस के बारे में सोच रहा हूं: 4kb रैम, कोई कर्नेल नहीं, न ही मानक सी lib।

क्या आप ऐसा करने के लिए एक मानक तरीका (शायद ओपन सोर्स लाइब्रेरी) के बारे में सोच सकते हैं?

यदि आप अपने स्वयं के समाधान कोड करते हैं तो आपके पास कोई सर्वोत्तम प्रथा है?

  • क्या आप पैकेज के अंत में मैजिक बाइट्स का भी उपयोग करते हैं?
  • शायद डिलीमीटर के बजाए समय अंतराल का उपयोग करना बेहतर है?
  • स्ट्रीम बाइनरी डेटा में पैकेज की शुरुआत कैसे पाती है?
  • शायद टेक्स्ट प्रोटोकॉल का उपयोग करना बेहतर है?

अद्यतन: कृपया फिर सवाल पढ़ें। मुझे लाइब्रेरी के लिए नहीं बल्कि अच्छे प्रथाओं के लिए पूछना चाहिए।

+0

के समान: http://stackoverflow.com/questions/815758/ –

+0

चाहिए 3 बुलेट बिंदु हो: "आप कैसे बाइनरी डेटा की एक धारा में पैकेट की शुरुआत मिल रहा है"? –

+0

धन्यवाद स्टीव :) –

उत्तर

3

एक सरल प्रोटोकॉल के विवरण के बारे में this answer I gave to a very similar question देखें। पैकेट के अंत में

  1. "मैजिक" बाइट्स कोई नुकसान नहीं करते हैं, लेकिन वे निरर्थक हो अगर आप पहले से ही पता कब तक पैकेट माना जाता है:

    अपने विशिष्ट अंक पर प्रतिक्रिया देने के , और एक सीआरसी है।

  2. समय-समय पर निर्दिष्ट करने के लिए समझदार हो सकता है, इसलिए यदि एक पैकेट के भीतर बाइट्स के बीच बहुत बड़ा अंतर होता है, तो एक त्रुटि ध्वजांकित होती है। Modbus का उपयोग करने के बाद, मैं समय-समय पर डिलीमीटरों का उपयोग करने के मूल्य से सहमत नहीं हूं।
  3. क्या आपका मतलब है, "बाइनरी डेटा की स्ट्रीम में आपको पैकेट की शुरुआत कैसे मिलती है"? यदि ऐसा है, तो शायद पैकेट के बीच न्यूनतम अंतर निर्दिष्ट करें, और/या प्रत्येक पैकेट के बाद प्राप्तकर्ता को एकनॉलवेज की आवश्यकता हो।
  4. डीबगिंग के लिए यह आसान बनाता है, और पीसी पर किसी भी विशेष सॉफ्टवेयर की आवश्यकता नहीं है, लेकिन बहुत कुशल नहीं है। बेशक, अगर उपयोगिता एक दक्षता से अधिक महत्वपूर्ण है, तो पाठ-आधारित प्रणाली पूरी तरह उपयुक्त है।
+0

आपके द्वारा प्रदान किया गया लिंक पैकेट की शुरुआत के संबंध में मेरे प्रश्न का उत्तर देता है। एचडीएलसी की असीमित फ्रेमिंग पढ़ना बहुत उपयोगी था। –

+0

एक बिंदु मैंने उल्लेख नहीं किया है: यहां तक ​​कि यदि पिछली बाइट लाइन शोर के कारण एक फ़्रेमिंग त्रुटि है, बाइट $ 00, $ 80, $ C0, $ F0, $ F8, $ FC, $ FE के बाइट मान के बाद बाइट, या $ एफएफ हमेशा सही ढंग से प्राप्त किया जाएगा। यदि पैकेट को बिना किसी स्वीकृति के वापस वापस भेजा जाएगा (अधिकतम थ्रूपुट की अनुमति देने के लिए; उम्मीद है कि पहला पैकेट का एक तब तक पहुंच जाएगा जबकि दूसरा पैकेट प्रसारित किया जा रहा है) यह प्रत्येक पैकेट को उन बाइट मानों में से एक के साथ समाप्त करने के लिए उपयोगी हो सकता है, ताकि एक फ़्रेमिंग एक पैकेट में त्रुटि अगले को दूषित नहीं करेगी। – supercat

0

आपके आई/ओ प्राइमेटिव से परे केवल एक चीज सीआरसी गणना होने जा रही है। कोड के साथ एक निफ्टी आलेख है, here

+0

लेख अच्छा लग रहा है :)। धन्यवाद। लेकिन सीआरसी समस्या नहीं है क्योंकि हमने इसे आरएफ ट्रांसमिशन के लिए पहले से ही लागू किया है। –

3

इस तरह की कुछ चीज़ों के लिए जब आप अपने डिवाइस पर काम करने का मौजूदा समाधान प्राप्त करते हैं, तो यह केवल पहिया को फिर से शुरू करना आसान होता।

void buffer_packet(unsigned char rx_byte) 
{ 
    static unsigned char byte_count = 0; 
    static unsigned char packet[8]; 

    packet[byte_count++] = rx_byte; 
    if (byte_count == 8) 
    { 
     unsigned char crc = calculate_crc(packet, 8); 

     write_uart(0x55); 
     write_uart(8); 
     while (byte_count--) 
     { 
      write_uart(packet[7 - byte_count]); 
     } 
     write_uart(crc); 
    } 
} 

या शायद मैं आपकी समस्या को कम करके आंका रहा हूं। यदि आप आरएस 232 बिट्स को उत्पन्न करने के लिए देख रहे हैं तो अपने माइक्रोक्रोनरोलर डेटाशीट में देखें।

+0

मैंने अपने प्रश्न को स्पष्ट रूप से पर्याप्त नहीं बताया था। कार्य आसान दिखता है लेकिन मैं एम्बेडेड प्रोग्रामिंग के लिए काफी नया हूं इसलिए मुझे सर्वोत्तम प्रथाओं में दिलचस्पी है। –