2015-05-12 9 views
7

क्या ट्विस्टेड पायथन के साथ आरएफसी 2217 नेटवर्क वाले सीरियल पोर्ट से कनेक्ट करने का कोई तरीका है?ट्विस्टेड पायथन के साथ आरएफसी 2217 नेटवर्क धारावाहिक बंदरगाहों का उपयोग करें?

Pyserial serial.serial_for_url("rfc2217://...")function के माध्यम से इसका समर्थन करता प्रतीत होता है। और वे संकेत देते हैं कि सीरियल कनेक्शन के प्रबंधन के लिए घुमावदार उपयोग का उपयोग किया जाता है, हालांकि twisted.internet.serialport.SerialPort एक पोर्ट नाम या संख्या की अपेक्षा करता है जो बताता है कि यह serial.Serial कन्स्ट्रक्टर को पास कर रहा है।

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

socat PTY,link=/dev/myport TCP:192.168.1.222:9001 

संपादित: pyserial faq धारावाहिक वस्तुओं instantiating के लिए इस संशोधन का सुझाव:

try: 
    s = serial.serial_for_url(...) 
except AttributeError: 
    s = serial.Serial(...) 

सुनिश्चित नहीं हैं कि अगर यह हालांकि मदद करता है ...

+0

मेरे पास आपके लिए कोई जवाब नहीं है मुझे डर है; और मुझे संदेह है कि जवाब होने वाला है * नहीं; अभी नहीं*; और आप शायद एक समस्या दर्ज करना चाहते हैं :) - हालांकि आप मुझे सोच रहे हैं कि हम shoudl भी इस तरह की एक विशेषता [सर्किट.io.Serial] में जोड़ें (https://github.com/circuits/circuits/ ब्लॉब/मास्टर/सर्किट/आईओ/सीरियल.py) –

+0

धन्यवाद जेम्स, हाँ, यदि कोई अच्छा जवाब नहीं है तो मैं एक समस्या/फीचर अनुरोध दर्ज करने पर विचार करूंगा। आपके संपादन में –

+0

डब्लूआरटी; मुझे लगता है कि आप '' अगर ": //" में '' करना चाहते हैं। यानी: एक यूआरआई या कुछ के लिए परीक्षण। –

उत्तर

2

मैं इस निष्कर्ष पर आ गए हैं कि का उपयोग कर Pyserial के ट्विस्टेड पायथन के साथ आरएफसी 2217 समर्थन गैर-तुच्छ है। RFC2217 की Pyserial के कार्यान्वयन, being currently experimental के अलावा, धागे का उपयोग करता सॉकेट कनेक्शन जो वे चुनिंदा आधारित अनुप्रयोगों के लिए एक समस्या होने के रूप में राज्य के प्रबंधन के लिए:

वर्तमान कार्यान्वयन एक धागा है कि (आंतरिक) सॉकेट से पढ़ने रहता है शुरू होता है। थ्रेड स्वचालित रूप से आरएफसी 2217 द्वारा प्रबंधित किया जाता है। सीरियल पोर्ट ऑब्जेक्ट ओपन()/क्लोज़() पर। हालांकि यह उपयोगकर्ता अनुप्रयोगों के लिए एक समस्या हो सकती है जो थ्रेड के बजाय चयन का उपयोग करना पसंद करते हैं।

यह tiserialport.SerialPort उपवर्ग और _serialFactory विधि (जो pyserial वस्तु बनाता है सीरियल पोर्ट तक पहुँचने के लिए प्रयोग की जाने वाली)

class SerialPort(serialport.SerialPort): 
    def _serialFactory(self, dev, *args, **kwargs): 
     " pyserial recommends the following for supporting serial urls " 
     try: 
      return serial.serial_for_url(dev) 
     except AttributeError: 
      return serial.Serial(dev, *args, **kwargs) 

हालांकि अधिलेखित करने के लिए काफी सीधे आगे है, जिसके परिणामस्वरूप वस्तु का अभाव एक फाइल डिस्क्रिप्टर और इसलिए fileno() विधि (t.i._posixserialport द्वारा आंतरिक रूप से उपयोग किया जाता है) एक अपवाद फेंकता है।

--- <exception caught here> --- 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/base.py", line 1204, in mainLoop 
    self.doIteration(t) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/selectreactor.py", line 105, in doSelect 
    [], timeout) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/_posixserialport.py", line 48, in fileno 
    return self._serial.fd 
exceptions.AttributeError: 'Serial' object has no attribute 'fd' 

वर्तमान समाधान प्रश्न में वर्णित के रूप में या तो socat उपयोग करने के लिए कर रहे हैं, या नेटवर्क धारावाहिक सर्वर के लिए मैं उपयोग कर रहा हूँ (Brainboxes ES-842) आप के बजाय "कच्चे टीसीपी" मोड में कॉन्फ़िगर "कर सकते हैं टेलनेट/आरएफसी 2217 "मोड और बस एक मौजूदा टीसीपी कनेक्शन पर अपने मौजूदा प्रोटोकॉल का उपयोग करें (जब तक आप प्रवाह नियंत्रण या अन्य धारावाहिक नियंत्रण रेखाओं के आधार पर नहीं हैं और एक पूर्व निर्धारित निर्धारित बॉड दर का उपयोग कर सकते हैं)।

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