बाइनरी में इनपुट और शून्य के बीच भ्रम से बचना?


10

मान लीजिए मैं एफएम के माध्यम से डेटा प्रसारित कर रहा हूं जहां 0 2Hz है और 1 4Hz है। कोई इनपुट न होने पर ट्रांसमीटर 2Hz ट्रांसमिट कर रहा है। यदि मैंने पुनः प्राप्त बाइनरी को एक माइक्रोकंट्रोलर के UART पोर्ट में खिलाया, तो माइक्रोकंट्रोलर बिना डेटा और 0 के बीच अंतर कैसे करेगा?

उदाहरण के लिए ASCII वर्णों को प्रेषित करते समय यह प्रासंगिक हो जाता है। मान लें कि निम्नलिखित स्ट्रिंग:

01000110 01101111 01101111 01100010 01100001 01110010

क्योंकि मैंने रिक्त स्थान जोड़े हैं, इसलिए हम इसका अनुवाद कर सकते हैं:

foobar

लेकिन एक मशीन को स्ट्रिंग इस तरह दिखेगा:

010001100110111101101111011000100110000101110010

जब आप बाइनरी प्राप्त कर रहे हैं, तो आप उन "स्पेस" को कैसे बनाएंगे ताकि आपको ASCII वर्ण गड़बड़ न हों?


5
यहाँ है कि कैसे UART इसे हल करता है, लिंक । स्टॉप और स्टार्ट बिट्स, क्योंकि zou इसे एक UART पोर्ट को खिलाते हैं zou उन्हें भी प्रसारित करना चाहिए।
बेंस कौलिक्स

मुझे डर है कि मैं आपके आरेख को काफी नहीं समझता। ऐसा प्रतीत होता है कि "स्टार्ट बिट" बस शून्य है, जो मेरी समस्या को पुनः स्थापित करता है। उदाहरण के लिए, यह कैसे पता चलेगा कि 01111000 और 00111100 के बीच का अंतर यदि स्ट्रिंग 000 01111000 000 था?
एलनफ

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

जवाबों:


16

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

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


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

6

इसके लिए बहुत सारी तकनीकें हैं। आप मैनचेस्टर कोडिंग या NRZ कोड देखना चाह सकते हैं। या 8 बी / 10 बी कोडिंग , जो प्रत्येक 8 डेटा बिट्स को 10-बिट अनुक्रम में मैप करता है जो घड़ी की वसूली, त्रुटि सुधार और विशेष "अल्पविराम" प्रतीकों के लिए अनुमति देता है जिसका उपयोग ट्रांसमिशन के प्रारंभ और अंत का पता लगाने के लिए किया जा सकता है।


5

सभी ASCII वर्ण 8bit चौड़े हैं, आप एक ASCII तालिका में देख सकते हैं। ASCII वर्णों का HEX मान FF (1111 1111) से आगे नहीं जाता है

UART एक समय में एक से अधिक डेटा बाइट (8 बिट्स) प्राप्त नहीं कर सकता है, साथ ही यह भी कि 8 बिट डेटा STOP और START बिट्स, PARITY और कुछ और हैं, जिन्हें आप नीचे दिखाए गए चित्र पर देख सकते हैं और जो UART संचार पैकेट बनाते हैं।

यहाँ छवि विवरण दर्ज करें

इसलिए जब आप UART को ASCII वर्ण भेज रहे हैं, तो आप उन्हें एक-एक करके भेज रहे हैं, और यह बताता है कि स्ट्रिंग कैसे बनाई जाती है। आप पहले से ही जानते हैं कि स्ट्रिंग केवल वर्णों की एक सरणी है।


4
ascii 7 बिट है, 8 नहीं, हालांकि संरेखण तुच्छ बनाने के लिए इसे 8 बिट में काटने के लिए सामान्य है। यह अन्य वर्ण सेट और utf8 को भी अनुमति देता है।
'13

0

UART प्रोटोकॉल, जैसा कि मैटियास ने समझाया है, एक समय-आधारित अतुल्यकालिक प्रोटोकॉल है। बिट्स के बीच की सीमाओं को क्या परिभाषित करता है, शुरुआत बिट की शुरुआत से लिया गया समय है। इसलिए माइक्रोकंट्रोलर (N+half)/baudrateशुरू होने के बाद बिट सेकंड "नमूना" करेगा । आधा बिट केवल बिट्स के बीच में नमूना करने के लिए है, इसलिए रिसीवर और ट्रांसमीटर के बीच समय में आधा अंतर हो सकता है (याद रखें कि अंतर संचयी हैं और सबसे बुरा मामला प्रत्येक फ्रेम के अंतिम बिट में होता है, जो आमतौर पर होता है लेकिन हमेशा नहीं, विन्यास के आधार पर 8-बिट चौड़ा)। इसे काम करने की कुंजी रिसीवर और ट्रान्सीवर के पास संभव के रूप में बॉड्रेट के साथ है।

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

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

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