एक से अधिक uart इंटरफ़ेस कैसे प्राप्त करें


30

ठीक है, मेरा एक uart इंटरफ़ेस है (TXD GPIO 14, RXD GPIO 15)। मैं कम से कम एक और अधिक इंटरफ़ेस चाहता हूं।

संभव समाधान:

  • बिट पीटना: दो असंबंधित स्पेयर GPIO का उपयोग करें। मैं समझता हूं कि टाइमिंग एक मानक लिनक्स पर एक समस्या है। क्या यह बहुत कम बॉड्रेट के साथ विश्वसनीय होगा?

  • स्विचिंग: आरपीआई तय करता है कि किस डिवाइस से कब बात करनी है। उदाहरण के लिए CD4066BC का उपयोग करना ।

  • 2 एक्स यूरेट ब्रिज के लिए स्पि: एक उपयुक्त हिस्सा नहीं मिला (उपलब्धता, मूल्य, पतला पैकेज)

  • usb to uart: महँगा

क्या अन्य विकल्प हैं? मैं स्विच करने के लिए इच्छुक हूं, अगर यह किया जा सकता है। आप क्या सलाह देंगे?


जवाबों:


10

एक USB UART, जैसे कि FTDI, वास्तव में महंगा नहीं है। आपके सभी अन्य विकल्प ध्वनि करते हैं जैसे वे ~ $ 13 की तुलना में आपको भागों और समय में अधिक खर्च करेंगे, यह आपकी लागत हो सकती है, और अविश्वसनीय या धीमी हो सकती है। बस तेज और परेशानी से मुक्त विकल्प के लिए जाएं, जैसे:

http://www.dfrobot.com/index.php?route=product/product&product_id=147#.UOamLG-sh8E

स्पार्कफुन एक भी बेचता है। वास्तव में, हो सकता है कि आप किसी पुराने USB डिवाइस से बस खींच सकते हैं या एक कबाड़ की दुकान से खरीद सकते हैं जो यह नहीं जानता कि यह क्या करता है।

मैंने एक Arduino प्रोजेक्ट के लिए UART अडैप्टर के लिए SPI के साथ गड़बड़ की, कोई मौजूदा लाइब्रेरी नहीं थी इसलिए मैंने अपना लिखा। अंत में यह ठीक काम करता है, लेकिन अगर मैं सिर्फ $ 15 के हिस्से में गिरा सकता था तो मेरे पास होगा। वास्तव में यह समय मुझे लागत मैं 4 सीरियल बंदरगाहों के साथ एक मेगा मिल जाना चाहिए था।

वैकल्पिक रूप से यदि आप बहुत सारे सीरियल पोर्ट चाहते हैं तो आप RS485 धारावाहिक को देख सकते हैं, जो 232 (हालांकि संगत नहीं) के समान है, जो मल्टी-ड्रॉप का समर्थन करता है, यानी एक पंक्ति में कई इंटरफेस।


1
सॉफ्टवेयर के दृष्टिकोण से यह आसान विकल्प भी है। FTDI में बॉक्स से बाहर लिनक्स ड्राइवर सपोर्ट है। अन्य सभी विकल्पों में श्रमसाध्य चालक के काम की आवश्यकता होगी।
बेर

Cp2102 मेरी पसंदीदा usb uart चिप है। एक त्वरित अमेज़ॅन खोज ने उन्हें एक केबल के साथ $ 6.99 (वास्तव में $ 1.50 संपादित करें) के लिए प्रकट किया! हरा नहीं सकते!
portforwardpodcast

6

यदि आप अतिरिक्त हार्डवेयर जोड़ना छोड़ना चाहते हैं और बस बिट-बैंगिंग मार्ग पर जाते हैं, तो यह उतना मुश्किल नहीं है जितना कि कुछ चित्र।

सबसे पहले, आपके संचार थ्रेड को वास्तविक समय पर जाना चाहिए:

#include<sched.h>

struct sched_param param;               
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
{
        perror("sched_setscheduler");
        return -1;
}

अब से, अपने धागा 950ms के लिए पूर्व empted नहीं किया जाएगा प्रत्येक दूसरे से बाहर * , जब तक यह नियंत्रण देता है स्वेच्छा से (के माध्यम से sched_yield(), या usleep()समय पर ढंग से) है, जो यह कभी पूर्व empted नहीं होगा। 850 मेगाहर्ट्ज सीपीयू के साथ आपका बिट-बैंग लूप सबसे तेज गति से भी बेकार हो जाएगा।

अब दुर्भाग्य से समय-समय पर नियंत्रण वापस करने की आवश्यकता का मतलब है जब आपका धागा सो रहा है, जो भी आपकी "विरोधी पार्टी" भेजता है, वह हमेशा के लिए खो जाएगा। लेकिन इस उद्देश्य के लिए आप ट्रांसमिशन कंट्रोल का उपयोग कर सकते हैं। या तो CTS लाइन के लिए कुछ और GPIO आवंटित करें जिसे आप उपज देने से पहले नीचे खींचते हैं और नियंत्रण बहाल करने पर वापस करते हैं:

  bcm2835_gpio_write(CTS_PIN, LOW);
  usleep(10);
  bcm2835_gpio_write(CTS_PIN, HIGH);

या (IMHO अधिमानतः) XON / XOFF ट्रांसमिशन कंट्रोल का उपयोग करें - सोने से पहले RS232 पर XOFF कैरेक्टर भेजें, ऑपरेशन शुरू करने के बाद XON करें। इनके लिए डिफ़ॉल्ट ASCII कोड '\x13'XOFF / "स्टॉप भेजना" और '\x11'XON / "फिर से भेजना" के लिए हैं।

बेशक आपके रिमोट डिवाइस को इनका पालन करना चाहिए। यदि ऐसा नहीं होता है, तो कुछ डेटा खो जाएगा।


4

मैंने पाया कि आप क्या देख रहे हैं: I2C / SPI गुलाम UART / IrDA / GPIO पुल तक।

वे एकल और दोहरे संस्करण (इसलिए 1 या 2 अतिरिक्त UART) में आते हैं। वे (NXP) भी (आवश्यक मामले में दूसरे पक्ष के लिए) I2C / SPI मास्टर से UART / IrDA / GPIO पुल पर जाते हैं।

इन चिप्स के बारे में अधिक जानकारी यहाँ और मास्टर समकक्ष से मिल सकती है।

मैक्सिम में चिप्स भी हैं जो ठीक यही काम करते हैं।


अच्छी जानकारी, लेकिन NXP लिंक यहाँ HTTP 403 देते हैं।
टॉम

यहां प्रासंगिक डेटाशीट है: nxp.com/documents/data_sheet/SC16IS752_SC16IS762.pdf ?
टॉम

3

UART पुलों के लिए USB सस्ते और आसानी से उपलब्ध हैं, लेकिन वास्तव में घटिया समय की विशेषताएं हैं। नेवार्क एक "एंबेडेड पाई" बोर्ड बेचता है जिसमें एक एसटीएम 32 एफ एआरएम प्रोसेसर होता है जिस पर आप नंगे-धातु कोड लिख सकते हैं। उस चिप पर तीन UARTs हैं, और मुझे लगता है कि वे बहुत तेजी से जा सकते हैं; यदि आप रास्पबेरी पाई के साथ संवाद करने के लिए एक का उपयोग करने के लिए थे जो अन्य प्रयोजनों के लिए दो उपलब्ध छोड़ देगा। डिस्क्लेमर: मैंने इनमें से एक बोर्ड खरीदा है, लेकिन अभी तक रास्पबेरी पाई का उपयोग केवल I / O को सीधे करने की आवश्यकता है।

यदि आप बहुत सारे UARTs चाहते हैं, तो एंबेडेड पाई बोर्ड पर STM32F शायद एक उचित संख्या को संभाल सकता है, खासकर यदि आप कुछ आर्म असेंबली भाषा लिखने के लिए तैयार हैं। अगर एक एकल बोर्ड पर 16 I / O पिंस के दो समूह उपलब्ध हैं, तो संभव है कि 16 एक साथ सॉफ्टवेयर UARTs हों, जो एक ही बार में एक सभ्य सभ्य बॉड दर पर काम कर रहे हों (जिनका आवधिक अंतराल 3x या 5x है या बॉड दर) 16-बिट से प्राप्त मान पोर्ट से बफ़र तक ले जाता है, और ट्रांसफ़ॉर्म पोर्ट पर एक बफ़र से 16-बिट प्री-कॉम्पीट्यूड मान को आउटपुट करता है; यदि आप ऐसा करते हैं, तो सॉफ़्टवेयर के लिए औसत सर्विसिंग समय प्रदान करें UARTs बहुत महान नहीं है, यह अगर कभी-कभार सबसे ख़राब स्थिति होती है तो कोई फर्क नहीं पड़ता (जैसे सभी सोलह पोर्ट एक साथ बाइट प्राप्त करते हैं)।

यह दृष्टिकोण वास्तव में प्राप्त करने के लिए उल्लेखनीय रूप से कुशलतापूर्वक काम कर सकता है, क्योंकि "सामान्य मामला" कोड को व्यक्तिगत यूएआरटी को देखने की आवश्यकता नहीं है। मान लीजिए कि आप 5x पर डेटा का नमूना ले रहे हैं, और बफर के अंतिम 47 बाइट्स को तुरंत नकल किया जाता है। डेटा को आरोही क्रम में बफर को लिखा गया है, तो आप यह जांच सकते हैं कि क्या किसी भी बाइट को 16 चैनलों में से किसी पर भी पूरी तरह से कहा गया है:

bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);

अगर bytes_ready शून्य है, तो कोई डेटा प्राप्त नहीं हुआ है। अन्यथा, यदि उदाहरण के लिए बिट 2 bytes_readyसेट किया गया है, तो इसका मतलब है कि प्राप्त डेटा बाइट डेटा के 2 बिट [rx_ptr-40], डेटा [rx_ptr-35], डेटा [rx_ptr-30], इत्यादि में एक बार हो सकता है। डेटा, आर्म्डफ्लैग के बिट 2 को साफ करें और लगभग 44 नमूनों के बाद इसे फिर से सेट करने की व्यवस्था करें।

इस दृष्टिकोण को उन नमूनों पर थोड़ा काम करने की आवश्यकता होगी जहां डेटा का एक बाइट पूरी तरह से प्राप्त होता है (और संभवत: बहुत सारे काम अगर सभी 16 चैनलों पर एक साथ डेटा का एक बाइट आता है), लेकिन अधिकांश नमूनों पर काम की मात्रा बहुत अधिक होगी मामूली। यदि किसी के पास 64 आई / ओ पिन थे, तो कोई भी "सामान्य" मामले में कोई अतिरिक्त काम जोड़कर इस दृष्टिकोण का उपयोग करके 32 यूएआरटी को संभाल सकता है।


1

एक Picaxe की तरह एक माइक्रोकंट्रोलर एक पिन पर सीरियल डेटा और एक निश्चित पिन पर धारावाहिक डेटा को उचित रूप से ले सकता है। यह प्रभावी रूप से आपको अधिक सीरियल आउटपुट देगा यदि आप पिकाक्स को यह बताने के लिए तैयार थे कि आउटपुट किस पिन पर है। यह भी ऐसा ही कर सकता है, लेकिन इसके विपरीत, इसलिए यह कई उपकरणों से सीरियल डेटा प्राप्त कर सकता है और इसे रास्पबेरी पाई को भेज सकता है। एक अन्य विकल्प यह हो सकता है कि कनेक्टेड डिवाइसों को बनाने की आवश्यकता हो क्वालिफायर की । इसका मतलब यह है कि डिवाइस 1 को डेटा 'd1' प्राप्त करना होगा, उदाहरण के लिए इससे पहले कि यह सीरियल लाइन पर आगे के डेटा को सुने। डिवाइस 2 इसके क्वालिफायर के रूप में 'd2' हो सकता है। इसका मतलब यह होगा कि डिवाइस 1 को 'हैलो' कहने के लिए, आपको केवल UART लाइन पर 'd1hello' भेजना होगा।

Picaxes काफी सस्ते हैं, आप उन्हें http://www.techsupplies.co.uk/ पर प्राप्त कर सकते हैं और वे कई आकारों में पिनों की विभिन्न संख्याओं और इसी तरह आते हैं।


1

यदि कई UART दास उपकरणों के संचार को समानांतर में होने की आवश्यकता नहीं है, तो आप उनके बीच उपलब्ध UART पोर्ट को साझा कर सकते हैं। आप जिस डिवाइस से बात करना चाहते हैं, उसके लिए केवल RxD / TxD कनेक्शन को सक्षम करने के लिए आप ट्रांजिस्टर का उपयोग कर सकते हैं। इन ट्रांजिस्टर को अन्य रास्पबेरी पाई GPIO पिन द्वारा नियंत्रित किया जा सकता है।


1

रास्पबेरी पाई 4 4 यूएआर इंटरफेस तक का समर्थन करता है जो अब डिवाइस ट्री ओवरले के माध्यम से सक्षम होने की आवश्यकता है। आप यह कर सकते हैं कि यह कैसे किया जाए और यहाँ किस पिन का उपयोग किया जाए:

https://www.raspberrypi.org/forums/viewtopic.php?t=244827

आरपीआई फाउंडेशन अभी भी इसके लिए दस्तावेज तैयार कर रहा है।


0

मुझे भी यही समस्या थी। मुझे 2-4 जीएसएम मॉड्यूल से कनेक्ट करने की आवश्यकता है और मुझे हार्डवेयर समाधान मिला: http://www.instructables.com/id/SPI-to-4-x-UART-Bridge-MULTIUART/

यह समाधान PIC24FJ64GA306 पर आधार है। आप Atmel mcu के साथ PIC को बदल सकते हैं, लेकिन आपको नया PCB बनाना होगा :)


0

मैं SC16IS752 IC का उपयोग कर रहा हूं जो कि 2xUART कनवर्टर के लिए SPI है। यह रास्पियन स्ट्रेच के साथ अच्छी तरह से काम करता है।

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


-1

Https://www.kickstarter.com/projects/1915118535/uart-hat-for-raspberry-pi पर एक नज़र डालें, मुझे आशा है कि यह आपकी समस्या को हल कर सकता है


1
चूंकि यह एक ऐसा उत्पाद नहीं है जो वास्तव में उपलब्ध है, जो इसे एक खराब विकल्प बनाता है।
Jacobm001

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