क्या Arduino को दो उपकरणों के बीच UART कनेक्शन पर "जासूसी" करने के लिए इस्तेमाल किया जा सकता है?


11

मुझे कार्यक्षमता बढ़ाने के लिए मौजूदा हार्डवेयर में एक Arduino (वास्तव में सिर्फ IC) स्थापित करने की आवश्यकता है।

मैं जो करना चाहता हूं, वह Arduino को कनेक्ट करना है ताकि यह एक बोर्ड पर दो चिप्स के बीच I / O लाइनों पर "spys" हो। यदि Arduino उस UART कनेक्शन पर एक विशिष्ट कीवर्ड चुनता है, तो यह आउटपुट पिंस के एक अलग सेट पर एक विशिष्ट कार्रवाई करेगा।

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

जवाबों:


17

अगर मैं सही ढंग से समझता हूं कि आपके पास UART के माध्यम से 2 डिवाइस जुड़े हैं। मैं सिर्फ TX, RX और GND लाइनों को उपकरणों के बीच जुड़ा हुआ मानता हूं? (यानी, कोई डीटीएस / सीटीएस / डीटीआर / आरटीएस नियंत्रण लाइनों का उपयोग नहीं किया गया - यह विशिष्ट है)।

इस परिदृश्य में, डिवाइस 1 का TX (ट्रांसमिट) डिवाइस 2 के RX (प्राप्त), और इसके विपरीत से जुड़ा हुआ है। उनके आधार एक दूसरे से जुड़े हुए हैं। इस प्रकार, प्रत्येक उपकरण एक ही समय में संचारित और प्राप्त किया जा सकता है (प्रत्येक अलग तार पर संचारित होता है, संचार पूर्ण-द्वैध होता है)।

मेरे द्वारा इस सब का उल्लेख करने का कारण यह है कि यह स्पष्ट हो जाता है कि "सूँघना" या "सुनना", आपको वास्तव में वार्तालाप के दोनों पक्षों को सुनने के लिए 2 UART की आवश्यकता होगी।

मूल रूप से, आप सभी यह सुनिश्चित करेंगे कि सभी 3 उपकरणों के UART GND को छोटा किया गया है, और कनेक्ट (वास्तव में, "टी", जैसा कि टी-फिटिंग में, प्लंबिंग की तरह) डिवाइस 1 & डिवाइस 2 की TX लाइनें 2 RX लाइनों तक 2 UARTs पर सुनिश्चित करें कि बॉड दरों को सभी समान रूप से कॉन्फ़िगर किया गया है।

बहुत सारे Arduino बोर्ड / डिज़ाइन हैं। सबसे आम आजकल, ड्यूमिलानोव, ATMega328P का उपयोग करता है, जो मुझे लगता है कि केवल 1 UART (अच्छी तरह से, USART) है। इसलिए आपको या तो दूसरे UART IC को वायर करना होगा, या दूसरे रिसीवर पर "बिट बैंगिंग" का सहारा लेना होगा।

Async UART संचार अच्छी तरह से परिभाषित है, स्टार्ट और स्टॉप बिट्स (और कभी-कभी समता बिट्स) के साथ, इसलिए यदि आपका प्रोसेसर काफी तेज है, तो आप बस डिवाइस के UART TX लाइनों में से एक इनपुट के रूप में कॉन्फ़िगर किए गए GPIO से कनेक्ट कर सकते हैं, और लाइन को पोल कर सकते हैं। START & STOP और नमूना बिट्स का पता लगाने के लिए ओवरसैंपलिंग के साथ पर्याप्त तेज़। जैक गन्सल का लेख "बिट बैंगिंग" आपको चबाने के लिए बहुत कुछ देगा।

BeyondLogic पर RS232 तरंग का एक सभ्य विवरण पाया जा सकता है ।

ध्यान दें कि वोल्टेज स्तर (0 / + 5, -10V / + 10V, आदि) जैसे अन्य मुद्दे हैं जिन्हें आपको ध्यान में रखना होगा ("RS232 स्तर कन्वर्टर्स" पर परे तर्क अनुभाग देखें)। ऊपर चर्चा की गई "लाइनों को कनेक्ट करें" दृष्टिकोण के अलावा हार्डवेयर इंटरफेसिंग पर चर्चा करने के लिए आपके पास आपके सिस्टम पर पर्याप्त जानकारी नहीं है। वोल्टेज के स्तर का मिलान किया जाता है, आमतौर पर TX लाइन को दूसरे रिसीवर (स्निफर) में "टी" करने की समस्या नहीं होती है, लेकिन यदि TX में पर्याप्त ड्राइव नहीं है, तो आपको रोकने के लिए बफर / ड्राइवर डालने की आवश्यकता हो सकती है अपमान से संकेत।


सुंदर! मुझे केवल एक दिशा में यात्रा करने वाले डेटा की आवश्यकता होगी इसलिए ATMega चिप पर एकल UART बस पर्याप्त है! दो चिप्स +/- 5V UART के साथ संवाद करते हैं, जो मुझे लगता है कि ATMega के समान है। वाह, यह होना चाहिए! धन्यवाद!
ब्रैड हेन

@ ब्रैडहिन, जिसे आप "+/- 5V" कह रहे हैं, उसे आमतौर पर "TTL स्तर" कहा जाता है - en.wikipedia.org/wiki/Logic_level देखें ।
मेल्स

3
@Mels +/- 5V टीटीएल नहीं है, टीटीएल ग्राउंड से नीचे नहीं जाता है। यह RS-232 है।
nmz787

9

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

चूंकि UART लिंक एक तर्क उच्च (1) स्तर पर ट्रांसमीटर की निष्क्रिय स्थिति का उपयोग करता है आप 2-इनपुट और गेट का उपयोग करेंगे और प्रत्येक इनपुट से TX को एक इनपुट से कनेक्ट करेंगे। AND गेट का आउटपुट आपके स्निफर के UART (यह RX पिन है) के लिए आपका इनपुट है। अब डिवाइस B की TX लाइन लें और इसे स्निफर पर I / O पोर्ट पर भी लाएं। जब यह पिन ऊंचे से नीचे जाता है तो आप एक अवरोध उत्पन्न करने के लिए स्निफर को कॉन्फ़िगर करेंगे।

पुन: उपयोग करने के लिए: डिवाइस A UART TX -> और गेट इनपुट। डिवाइस बी UART TX -> अन्य और गेट इनपुट और स्निफर GPIO पिन। और गेट का उत्पादन -> स्निफर UART RX लाइन।

UART के संचार में एक स्टार्ट बिट, कुछ संख्या में डेटा बिट्स, एक वैकल्पिक समता बिट और एक या अधिक स्टॉप बिट्स होते हैं। चूँकि निष्क्रिय अवस्था एक तर्क उच्च (1) है, EVERY बाइट की शुरुआत एक तर्क कम (0) होगी और स्निफर पर अवरोध आग लग जाएगी। जबकि आपका स्निफर I / O इंटरप्ट कर रहा है UART हार्डवेयर AND गेट से बिट्स एकत्रित कर रहा होगा। जब तक UART को स्टॉप बिट प्राप्त हुआ है, तब तक I / O इंटरप्ट लंबे समय तक किया जाएगा और UART RX इंटरप्ट आग देगा।

बीच-बीच में आईओ-परिवर्तन दिनचर्या एक "दिशा" चर को इंगित करेगी कि संचार "बी-> ए" दिशा में हैं। स्निफर के UART को प्राप्त रुकावट इस "दिशा" चर को देखेगा और उचित बफ़र को प्राप्त बाइट लिखेगा। UART RX रुकावट फिर "दिशा" चर को डिफ़ॉल्ट "A-> B" स्थिति पर सेट करेगा:

volatile int direction = 0;           /* 0 = A -> B */

void io_interrupt(void)
{
    direction = 1;                    /* switch direction, now B -> A */
}

void uart_interrupt(void)
{
    unsigned char b;

    b = UART_RX_REG;
    if(direction) {
        store_byte_to_device_b_sniff_buffer(b);
    } else {
        store_byte_to_device_a_sniff_buffer(b);
    }

    direction = 0;                   /* reset direction to default A -> B */
}

यह कोड स्पष्टता के लिए लिखा गया है और जरूरी नहीं कि आप वास्तविक दुनिया की स्थिति में क्या लिखें। व्यक्तिगत रूप से मैं उचित FIFO संरचना के लिए एक संकेतक "दिशा" बनाऊंगा, लेकिन यह पूरी तरह से एक और व्यायाम है। :-)

जब डिवाइस ए बात कर रहा है I / O लाइन नहीं चलती है (यह डिवाइस B के UART ट्रांसमीटर के निष्क्रिय होने के बाद से तर्क 1 पर रहता है), और UART RX रुकावट को एक बाइट प्राप्त होगा, देखें कि दिशा A-> B है , और डेटा को उस बफ़र में संग्रहीत करें। जब डिवाइस B बात कर रहा है जैसे ही I / O लाइन कम होगी, जैसे ही डिवाइस B डेटा को शिफ्ट करना शुरू करेगा, और I / O इंटरप्ट रूटीन सेट कर देगा कि डिवाइस B बात कर रहा है। UART RX रुकावट अंतत: सभी बिट्स एकत्र होने के बाद फायर करेगा और चूंकि I / O इंटरप्ट ने दिशा रजिस्टर को उचित रूप से सेट करने का ध्यान रखा है, प्राप्त बाइट को सही बफर में संग्रहीत किया जाएगा।

प्रेस्टो: दो उपकरणों के बीच आधा-द्वैध संचार एक ही UART और I / O लाइन के साथ स्निफर पर कब्जा कर लिया गया, जिसमें कोई बिट-बैंग UART संचार नहीं था।


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

स्निफर UART RX लाइन AND गेट के आउटपुट से जुड़ा है। डिवाइस ए का UART TX AND गेट के एक इनपुट से जुड़ा है, और डिवाइस B का UART TX AND गेट के अन्य इनपुट से जुड़ा है। चूंकि UART की निष्क्रिय (कोई ट्रैफ़िक) स्थिति एक तर्क '1' है, और गेट प्रभावी रूप से दोनों संचारित संकेतों को एक में जोड़ता है। स्निफर पर I / O लाइन का उपयोग डिवाइस बी के स्टार्ट बिट का पता लगाने के लिए किया जाता है ताकि वह अपने UART पर प्राप्त होने वाली बाइट को ले सके और उसे उपयुक्त बफर (डिवाइस ए ट्रैफिक या डिवाइस बी ट्रैफिक) में डाल सके।
akohlsmith

कोड टुकड़ा और AND गेट का वायरिंग स्निफर को एक ही UART के साथ ट्रैफ़िक प्रवाह की दोनों दिशाओं को रिकॉर्ड करने की अनुमति देता है। यह केवल तभी काम करता है जब यातायात आधा-द्वैध हो। इसका मतलब है कि जब एक उपकरण बात कर रहा है, तो दूसरा सुन रहा है। अगर दोनों एक ही समय (पूर्ण द्वैध) पर बात करते हैं तो यह बिल्कुल भी काम नहीं करेगा।
19:00 पर akohlsmith

5

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

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