सॉफ्टवेयर UART में स्टार्ट बिट का पता लगाना


9

मैं GPIO पिन का उपयोग करके अपने माइक्रोकंट्रोलर पर एक सॉफ्टवेयर UART लिखने के साथ प्रयोग कर रहा हूं। यह एक परियोजना पर अस्थायी रूप से एक UART चैनल जोड़ने के लिए है जब तक कि हम नए डिजाइन को लागू नहीं करते हैं जो अधिक UART पोर्ट के साथ एक UC का उपयोग करता है।

मुझे जो कठिनाई हो रही है, वह धारावाहिक धारा में एक शुरुआत बिट का सही पता लगा रही है। धारा का स्रोत बाहरी है और जब मेरी डिवाइस की शक्ति बढ़ जाती है तो कोई परवाह नहीं करता है। इसलिए यह बहुत संभव है कि मेरी डिवाइस एक बाइट ट्रांसमिशन के बीच में डेटा बिट्स को देखना शुरू कर देगी। निस्संदेह, यह मेरे सॉफ़्टवेयर UART को गलत मान पढ़ने के लिए प्रेरित करेगा, क्योंकि यह एक शुरुआत बिट और किसी भी अन्य उच्च-से-कम संक्रमण के बीच अंतर बताने में सक्षम नहीं होगा।

क्या यह एक UART चैनल के साथ एक अपरिहार्य मुद्दा है? या फिर कुछ चालाक चाल है जो यूसी निर्माता अपने हार्डवेयर यूएआरटी में उपयोग करते हैं?


अच्छा प्रश्न। क्या आपका बाहरी उपकरण लगातार वर्ण भेजता है? यदि नहीं, तो आपको चेक करना चाहिए कि क्या स्टार्ट बिट और स्टॉप बिट संरेखित हैं। और यदि डेटा इनबेटइन आपके चेक (सम / बिट) से मेल खाता है?
पॉल

क्या आपके पास बाहरी UART स्ट्रीम एक प्रस्तावना भेज सकता है? एक विशेष डेटा की एक धारा की तरह एक स्ट्रीम इंगित करता है कि आने वाली बिट से अलग होगा? यदि आप ऐसा कर सकते हैं, तो आप यह बता पाएंगे कि डेटा गलत है या नहीं, आपको ट्रांसमिशन के बीच में पावर अप करना चाहिए या नहीं।
कायरतापूर्ण

1
यदि धारा प्रवाह में कोई पर्याप्त लंबी निष्क्रिय अवधि नहीं है - तो आपकी योनी को इससे उबरने की संभावना नहीं है। यदि आप "स्टॉप" बिट प्राप्त नहीं कर रहे हैं, तो आंशिक समाधान आ सकता है। तब आप राज्य को रीसेट करने और पुन: प्रयास करने में सक्षम होंगे।
यूजीन श।

1
आप एक विशेष प्रस्तावना की जरूरत नहीं है ... बस एक कभी-कभी एक चरित्र (inc.start, बंद करो बिट्स) की तुलना में लंबे समय तक आराम करो। या, एक पंक्ति में 10+ स्टॉप बिट्स, जो एक ही बात है।
ब्रायन ड्रममंड

2
@ फ़्यूज़, बाहरी उपकरण लगातार वर्णों की एक लंबी धारा भेजता है, लेकिन यह कभी-कभी निष्क्रिय हो जाता है। सबसे खराब स्थिति, मैं केवल इनपुट को अनदेखा कर सकता हूं जब तक कि यह पहली बार निष्क्रिय न हो जाए।
दान लैक्स

जवाबों:


5

यदि आप एक स्टॉप बिट लंबाई का उपयोग करते हैं जो कि बाकी डेटा स्ट्रीम से आसानी से डिस्कनेक्ट हो जाता है, जैसे कि 1.5 बिट समय, तो मध्य-प्रसारण प्राप्त करना शुरू करना आसान होना चाहिए। हालांकि, यह बढ़े हुए ओवरहेड की लागत पर आता है। जैसे ही आप अपने स्टॉप बिट की लंबाई बढ़ाते हैं, आपके कुल उपलब्ध डेटा थ्रूपुट को नुकसान होगा।

यदि आप बस का उपयोग नहीं कर रहे हैं जो भारी है, और अक्सर फ्रेम के बीच अंतराल है, तो यह बस इन अंतरालों में से एक के लिए प्रतीक्षा करने की बात हो सकती है, और फिर अपनी शुरुआत के रूप में पहला हाय-लो ट्रांसमिशन उठा सकता है। अगली शुरुआत थोड़ी।

ध्यान रखें कि डेटा बिट्स की संख्या पूर्वानुमेय होनी चाहिए, जैसा कि फ्रेम आकार होना चाहिए, इसलिए भले ही आप बस की क्षमता का 100% उपयोग कर रहे हों और आपका स्टॉप बिट एक ही समय हो, आपको अभी भी खोजने में सक्षम होना चाहिए यदि आप पर्याप्त फ्रेम एकत्र करते हैं तो बिट शुरू करें। हर फ्रेम को इसमें हाई-लो ट्रांज़िशन की गारंटी दी जाती है। स्टॉप बिट वह है जो हमेशा उच्च होता है। शुरुआत बिट वह है जो हमेशा कम होती है। अपने डेटा को यादृच्छिक (या यादृच्छिक रूप से पर्याप्त) मानकर, आप अपने फ्रेम के एक बफर को बनाने के रूप में सरल रूप में कुछ कर सकते हैं, इसमें हर बिट सेट करें, और फिर फ्रेम को इकट्ठा करते रहें और उन्हें बफर में तब तक रखें जब तक कि बफर में केवल 1 न हो। थोड़ा सा सेट। यह बिट आपका स्टॉप बिट है। यह एक के बाद आपकी शुरुआत बिट है। देखा! तुमने पा लिया।

यदि आप समता बिट का उपयोग कर रहे हैं, तो एक और विकल्प यह होगा कि डेटा के दो फ़्रेमों को पकड़ा जाए, पहले बिट को स्टार्ट बिट के रूप में चुनें, और फिर चेकसम की गणना करें और समता बिट की तुलना करें। यदि यह मेल खाता है, तो आपको (शायद) स्टार्ट बिट मिल गया है। यदि ऐसा नहीं होता है, तो अगले कम बिट को उठाएं और तब तक दोहराएं जब तक आपको एक अच्छा चेकसम न मिल जाए यदि आप डेटा के अपने दो फ़्रेमों में एक बिट नहीं खोज सकते हैं जो एक वैध शुरुआत बिट के रूप में जांचता है, तो आपका डेटा दूषित हो गया था, और आपको दो और फ़्रेमों को हथियाने की आवश्यकता होगी।


नीट विचार और साथ में फ्रेम जब तक बस शुरू और बंद बिट्स जीवित रहते हैं। यह मेरे विशिष्ट अनुप्रयोग के लिए बहुत अधिक उपरीकरण होगा, लेकिन फिर भी चतुर।
दान लाख

यदि बाहरी डिवाइस ऐसा है, जिसका ओपी पर कोई नियंत्रण नहीं है (जो उसने प्रश्न के पहले टिप्पणी में बताया है), तो यह संभावना नहीं है कि वह स्टॉप बिट की लंबाई को बदलने में सक्षम होगा।
tcrosley

उस समय यह टिप्पणी नहीं की गई थी जब मैंने यह उत्तर लिखना शुरू किया था। हालाँकि, मेरे द्वारा सूचीबद्ध अन्य तीन विकल्प अभी भी इस मामले में लागू होते हैं कि स्टॉप बिट लंबाई तय हो गई है।
डॉ। फंक

3

हार्डवेयर यूएआरटी में भी यही समस्या है। लेकिन यह आमतौर पर एक है कि वैसे भी कम क्रम में ही हल करता है। प्रत्येक फ्रेम के अंत में, स्टॉप बिट की जांच करें, और यदि यह उच्च नहीं है, तो फ्रेम को छोड़ दें और अगले उच्च-से-कम संक्रमण की प्रतीक्षा करें। यह मानते हुए कि स्रोत से डेटा पूरी तरह से पैथोलॉजिकल नहीं है (उदाहरण के लिए, "यूयूयूयू" या एएससीआईआई 0x55 के लंबे तार), यूएआर अंत में वास्तविक शुरुआत बिट पर "चलना" होगा।


1

8N1 ट्रांसमिशन मानते हुए।

आपको एक पंक्ति में 9 उच्च या निम्न बिट्स की स्ट्रिंग की प्रतीक्षा करनी चाहिए।

यदि उच्च है तो यह या तो डेटा में एक निष्क्रिय अंतर या 0xFF वर्ण और STOP बिट
या
यदि कम START बिट और NULL 0x00 वर्ण को इंगित करेगा ।

या तो इन शर्तों में से एक पुनर्जीवन की अनुमति देगा।

इसे गति देने के लिए: यदि आप कुछ ऐसे वर्णों को जानते हैं, जो डेटा में संभव नहीं हैं, तो आप प्रत्येक बिट के लिए बार-बार आने वाले डेटा को पार्स कर सकते हैं और यदि आपको 7 अक्षरों की एक श्रृंखला मिलती है जो बकवास हैं (उच्च बिट सेट, कम मामला, नियंत्रण कोड, विराम चिह्न या जो भी हो) एक वैध चरित्र के बाद आप काफी हद तक सुनिश्चित हो सकते हैं कि आप पुन: सिंक्रनाइज़ किए जा रहे हैं।

जब आप एक अंतर्निहित UART परिधीय का उपयोग करते हैं और बिटवाइज मूल्यांकन करने में असमर्थ होते हैं तो आपको समान समस्याएं होंगी और सभी फ्रेमन त्रुटि बिट्स को रीसेट करने के लिए याद रखना होगा और जब भी वे होते हैं (विशेष रूप से पावर अप)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.