TtyUSB0 पर DTR अक्षम करें


11

मैं Pi से Arduino- क्लोन बोर्ड से जुड़ रहा हूं। समस्या यह है, कि मुझे ArTRino को कनेक्ट पर रीसेट करने से रोकने के लिए, DTR लाइन को अक्षम करना होगा।

मैंने पढ़ा है कि आरपीआई पर डीटीआर, डीसीडी और अन्य लाइनों को नियंत्रित करना संभव नहीं है। क्या यह विश्व स्तर पर आरपीआई के लिए सही है या केवल जीपीआईओ पिन के लिए धारावाहिक संचार के लिए उपयोग किया जाता है?

यदि यूएसबी पोर्ट पर डीटीआर को अक्षम करना संभव है, तो आप इसे कैसे पूरा करेंगे?

जवाबों:


6

USB सीरियल कन्वर्टर के गुणों का होस्टिंग सिस्टम के हार्डवेयर से कोई लेना देना नहीं है, लेकिन केवल USB सीरियल चिप के साथ और होस्टिंग सिस्टम के सॉफ्टवेयर स्टैक के साथ।

पीआई को स्टॉक लिनक्स यूएसबी सीरियल ड्राइवरों का उपयोग करना चाहिए।

इसलिए, आप hupclArduino साइट और अन्य जगहों पर प्रलेखित के रूप में सेटिंग को साफ़ करने के लिए सामान्य लिनक्स विधि के माध्यम से खुले / बंद पोर्ट के लिए DTR के लिंकेज को सक्षम / अक्षम कर सकते हैं:

stty -F /dev/ttyUSB0 -hupcl

या जो भी डिवाइस फ़ाइल वास्तव में आपके USB सीरियल पोर्ट से मेल खाती है, उसके साथ / dev / ttyUSB0 को बदलना (उदाहरण के लिए, जुड़ा पहला Uno / dev / ttyACM0 होगा)

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


क्या यह केवल तब तक काम करेगा जब तक होस्टिंग पाई पुनः चालू नहीं होती है?
user2395126

6

@ChrisStrattons पोस्ट बताता है कि stty -F /dev/ttyUSB0हैंगअप से बचने के लिए कैसे उपयोग किया जाता है जिसके परिणामस्वरूप रीसेट होता है। यहाँ यह पायथन में करने के लिए एक स्निपेट है:

import termios

path = '/dev/ttyACM0'

# Disable reset after hangup
with open(path) as f:
    attrs = termios.tcgetattr(f)
    attrs[2] = attrs[2] & ~termios.HUPCL
    termios.tcsetattr(f, termios.TCSAFLUSH, attrs)

ser = serial.Serial(path, 9600)
# etc.

ध्यान दें कि यूएसबी केबल को रिप्लेस करते समय सटीक संख्या हो सकती है, इसलिए मैं ग्लोबिंग द्वारा पथ का पता लगाता हूं:

try:
    path = glob.glob('/dev/ttyACM*')[0]
except IndexError:
    # retry, error out, etc.
    pass

मैंने पुष्टि की है कि यह उबंटू में जेनेरिक x86_64 लैपटॉप और रास्पबेरी पाई 2 पर काम करता है।
सेरिन

वहाँ का उपयोग करने के लिए कोई कारण है termios, कहते हैं os.system("stty -F /dev/ttyUSB0 -hupcl"),? इसके अलावा, btw, मैंने देखा कि यह Arduino को होस्ट सिस्टम के संचालित होने के बाद पहली बार कनेक्ट करने से रोकता है; यह इसे बाद के कनेक्ट पर रीसेट करने से रोकता है। जो कुछ भी नहीं से बेहतर है। लेकिन मेरी इच्छा है कि मैं इसका पता लगा सकूं कि इसे कैसे रोकना है।
जेसन सी

2
@JasonC termiosएक फोर्क / एक्जेकशन (कॉल) को एक बाहरी प्रोग्राम ( stty) में सेव करता है । निश्चित नहीं है कि डीटीआर चीज़ के बारे में क्या करना है, मुझे लगता है कि मैंने इस "सुविधा" को स्वीकार कर लिया है और यह पता लगाने के लिए कि क्या Arduino और Pi पर एप्लिकेशन सिंक में मिला है, कुछ तर्क (लिखने / पढ़ने से कस्टम हैंडशेक) को जोड़ा।
लेकेनस्टेन

मेरा अंतिम समाधान यह था कि जब पीआई बूट करे तो स्टेंट कमांड जोड़ना होगा, उसके बाद पोर्ट पर एक इको द्वारा उस पहले रीसेट को मजबूर करने के लिए, और 3 सेकंड की देरी के लिए अर्दीनो रीसेट का इंतजार करना होगा। तब मुझे इसके बारे में कुछ भी नहीं सोचना है और न ही पायथन स्क्रिप्ट में इसके बारे में चिंता करना है। मैंने r rllocal में किया, लेकिन जहाँ भी। लागत +3 सेकंड पीआई बूट समय है।
जेसन सी

3

आप के बीच 120Ohm (या संयोजन बनाने के लिए 120Ohm) रोकनेवाला जोड़ सकते हैं RESETऔर 5Vयह पूरी तरह से रीसेट को रोक देगा। यह कम से कम इनवेसिव है क्योंकि अन्य समाधानों के लिए या तो बोर्ड से एक रोकनेवाला या संधारित्र हटाने की आवश्यकता होती है, यह अपलोड को जटिल करता है। यदि आप प्रोग्रामिंग कर रहे हैं तो रोकनेवाला न रखें। इसे हटा दो।

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

DTRट्रिगर होने पर भी लियोनार्डो बोर्ड रीसेट नहीं करता है, लेकिन समस्या तब शुरू होती है जब आपको इसे दूर से रीसेट करने की आवश्यकता होती है क्योंकि कभी-कभी यह रास्पबेरी से कनेक्शन खो देता है और आपको इसे भौतिक रूप से रीसेट करना होगा।


3
मुझे यकीन नहीं है कि यह एक पतन का हकदार है। यह इसे करने के लिए बेकार है, और सॉफ़्टवेयर आधारित नहीं है, लेकिन कुछ शोधों के बाद यह काम करने वाले हार्डवेयर समाधान के लिए प्रतीत होता है।
जेसन सी

0

यदि आप Seria और pySerial पुस्तकालय का उपयोग करते हैं, तो आप उपयोग कर सकते हैं:

सीर = धारावाहिक। सीरियल ('/ देव / ttyACM0', 9600, dsrdtr = True)


-1

आप PySerial का उपयोग कर सकते हैं। यहाँ पायथन कोड पर एक उदाहरण दिया गया है:

port =serial.Serial(
    "/dev/ttyUSB0",
    baudrate=57600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    dsrdtr = False
    )

अधिक विकल्पों के लिए Pyserial की जाँच करें


1
यह पुस्तकालय की समस्या नहीं है। मैंने 4 अलग-अलग परिवादों की कोशिश की है, हमेशा एक ही परिणाम - DTR आदेशों की अनदेखी की जाती है।
jnovacho

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

1
यह काम नहीं करता है। लिनक्स पर, यह अभी भी Arduino को रीसेट करने का कारण बनता है।
4

1
क्या यह पुष्टि कर सकता है कि मेरे पास जो कुछ भी Pi और Arduino के संस्करण पर काम नहीं करता है (मुझे नहीं पता, माफ करना, मुझे इन चीजों में से कुछ भी नहीं पता है, मैं जानना नहीं चाहता, मुझे बस कुछ कोड को डीबग करने के लिए एक सिस्टम दिया गया था पर, हेह।) इसके अलावा, यकीन नहीं है कि यह संबंधित है, लेकिन stty -F /dev/ttyUSB0 -cdtrdsrरिपोर्ट invalid argument: -cdtrdsr
जेसन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.