2011-02-23 9 views
11

पॉज़िक्स को पोर्ट खोलने पर आरटीएस पिन बदलने की आवश्यकता है। मैं इससे बचने का एक तरीका चाहता हूं।किसी पिन को बदलने के बिना लिनक्स में सीरियल पोर्ट कैसे खोलें?

+0

कृपया विस्तृत करें। आप आरटीएस के साथ क्या करना चाहते हैं? मानक को इसे बदलने की आवश्यकता है और क्यों? –

+0

मैं बंदरगाह खोलने के दौरान बिना परिवर्तन किए आरटीएस छोड़ना चाहता हूं –

+2

बस स्पष्ट करने के लिए - कम से कम लिनक्स में, खुले कॉलिंग ("/ dev/ttyUSB0", os.RDWR) दोनों आरटीएस और डीटीआर लाइनों को सीरियल पोर्ट में ऊपर ले जाती है। बंदरगाह खोले जाने के बाद, आईओटीटीएल को कॉल करके आरटीएस को फिर से कम किया जा सकता है। हालांकि, सवाल यह है कि आरटीएस उच्च गति के बिना डिवाइस को कैसे खोलें? – Nakedible

उत्तर

1

एक ही समस्या होने के बाद, मैं ftdi_sio कर्नेल ड्राइवर को पैच करके इसे आज़मा दूंगा। तुम बस ftdi_dtr_rts() इस तरह में कोड का एक छोटा सा टुकड़ा uncomment की जरूरत है:

static void ftdi_dtr_rts(struct usb_serial_port *port, int on) { 
    ... 
    /* drop RTS and DTR */ 
    if (on) 
     set_mctrl(port, TIOCM_DTR /*| TIOCM_RTS*/); // <<-- HERE 
    else 
     clear_mctrl(port, TIOCM_DTR /*| TIOCM_RTS*/); // <<-- and HERE 
} 

और आरटीएस हाथ मिलाना लाइन open() कॉल पर लंबे समय तक नहीं बदला है। नोट, कि जब तक आपका संशोधित कर्नेल ड्राइवर लोड हो जाता है, तब तक आरटीएस/सीटीएस हार्डवेयर हैंडशेक के साथ काम नहीं कर सकता है। 64 बिट और Ftdi FT2232H आधारित USB UART एडाप्टर लेकिन आप अभी भी मैन्युअल रूप से, उदा, को फोन करके आरटीएस हाथ मिलाना लाइन की स्थिति को नियंत्रित कर सकते .:

int opins = TIOCM_RTS; 
    ioctl(tty_fd, TIOCMBIC, &opins); 

मैं picocom 2.3A की Ctrl+A+G आदेश के साथ इस परीक्षण किया था, Kubuntu 16.04 चल रहा है।

आपको इस विषय पर अधिक जानकारी मिल सकती है here

+0

क्या आप जांच सकते हैं कि O_NONBLOCK विकल्प इसके साथ कैसे हस्तक्षेप करता है? –

+1

चेकिंग [picocom.c] (https://github.com/npat-efault/picocom/blob/master/picocom.c), यह 'O_NONBLOCK' का उपयोग करता है:' tty_fd = open (opts.port, O_RDWR | O_NONBLOCK | O_NOCTTY); 'और यह उपरोक्त वर्णित व्यवहार करता है। – Joe

-2

कॉलिंग fopen("/dev/ACM0", "r") आपको कुछ भी करने की आवश्यकता नहीं है :) आपको वह डेटा प्राप्त नहीं हो सकता है जो आप उम्मीद करते हैं।

+1

यह कॉल आरटीएस पिन बदल देगा। मुझे इससे बचने की ज़रूरत है। –

4

मुझे नहीं पता कि आप ऐसा क्यों करना चाहते हैं, लेकिन यह आपके सीरियल कंसोल के लिए लिनक्स कर्नेल ड्राइवर को संशोधित करके बहुत आसानी से किया जा सकता है, इसलिए यह आरटीएस टॉगल नहीं करता है। उदाहरण के लिए, drivers/tty/serial/8250/ में 8250 सीरीज़ ड्राइवर के लिए आप एमसीआर रजिस्टर (यूएक्सएमसीआरआर) में प्रत्येक लेखन को बदल सकते हैं ताकि यह सुनिश्चित किया जा सके कि बिट 1 (मास्क UART_MCR_RTS) कभी सेट नहीं किया गया है।

चूंकि यह उपयोगकर्ता स्पेस में दूर है, इसलिए आप भाग्य से बाहर हैं यदि आप कर्नेल ड्राइवर को संशोधित किए बिना ऐसा करना चाहते हैं।

+2

"कर्नेल को संशोधित किए बिना संभव नहीं है" एक बिल्कुल अच्छा जवाब है। धन्यवाद। – Nakedible

+3

"मुझे नहीं पता कि आप ऐसा क्यों करना चाहते हैं" -> एम्बेडेड बूटलोडर्स के लिए यह बहुत आम है कि आरटीएस रीसेट पिन से कनेक्ट हो और बूटलोडर पिन (या इसके विपरीत) से जुड़े डीटीआर से कनेक्ट हो। यदि रीसेट पिन को टॉगल किया गया है, यहां तक ​​कि माइक्रोसॉन्ड के एक अंश के लिए, चिप रीसेट हो जाएगा। इसका अर्थ यह है कि यदि आप डिवाइस के साथ सामान्य संचार के लिए सीरियल पोर्ट का उपयोग कर रहे हैं तो इस उद्देश्य के लिए नियंत्रण रेखाओं का उपयोग करना आसान नहीं है ... पहले नियंत्रण रेखाओं को डिस्कनेक्ट किए बिना :( – Thomas

+0

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

संबंधित मुद्दे