2012-01-09 17 views
6

मैंने इसे गुगल करने की कोशिश की, यहां कोई जवाब नहीं मिला, यहां खोजा गया, जवाब नहीं मिला। क्या किसी ने देखा है कि थ्रेड से सीरियल() ऑब्जेक्ट (पिसियरियल) को लिखने के लिए यह धागा सुरक्षित है और क्या थ्रेड बी से अवरुद्ध हो रहा है?pyserial - थ्रेड ए से सीरियल पोर्ट को लिखना संभव है, थ्रेड बी से पढ़ना अवरुद्ध करें?

मुझे पता है कि थ्रेड सिंक्रनाइज़ेशन प्राइमेटिव्स और थ्रेड-सुरक्षित डेटा संरचनाओं का उपयोग कैसे करें, और वास्तव में इस कार्यक्रम के मेरे वर्तमान रूप में सीरियल पोर्ट पर पढ़ने/लिखने के लिए समर्पित धागा है और मैं समन्वय के लिए थ्रेड-सुरक्षित डेटा संरचनाओं का उपयोग करता हूं ऐप में गतिविधियां

यदि मैं मुख्य थ्रेड से धारावाहिक बंदरगाह पर लिख सकता हूं (और इसे कभी नहीं पढ़ता) तो मेरा ऐप बहुत लाभान्वित होगा, और दूसरे धागे में पढ़ने को अवरुद्ध करके सीरियल पोर्ट से पढ़ा जाएगा (और इसे कभी भी लिखें)। अगर कोई वास्तव में मुझे अंदर जाना चाहता है तो यह ऐप को क्यों लाभ पहुंचाएगा, मैं अपने कारण जोड़ सकता हूं। मेरे दिमाग में सीरियल() का केवल एक उदाहरण होगा और यहां तक ​​कि थ्रेड बी सीरियल ऑब्जेक्ट पर अवरुद्ध पढ़ने में बैठेगा, थ्रेड ए सीरियल ऑब्जेक्ट पर लिखने के तरीकों का उपयोग करने के लिए सुरक्षित होगा।

कोई भी जानता है कि सीरियल क्लास का उपयोग इस तरह किया जा सकता है या नहीं?

संपादित करें: यह मेरे लिए होता है कि उत्तर मंच-निर्भर हो सकता है। यदि आपके पास इस तरह के प्लेटफ़ॉर्म के साथ कोई अनुभव है, तो यह जानना अच्छा होगा कि आप किस प्लेटफ़ॉर्म पर काम कर रहे थे।

संपादित करें: केवल एक प्रतिक्रिया हुई है लेकिन अगर किसी और ने यह कोशिश की है, तो कृपया अपने अनुभव के साथ प्रतिक्रिया दें।

उत्तर

11

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

+0

क्या आप PySerial का उपयोग कर रहे थे? और किस प्लेटफ़ॉर्म पर यह सफलतापूर्वक काम करता है? –

+0

मैं विंडोज पर पायसरियल का उपयोग कर रहा था, लेकिन कल्पना नहीं कर सकता कि यह किसी भी मंच पर क्यों काम नहीं करेगा। – TJD

+0

अपने अनुभव को साझा करने के लिए धन्यवाद! –

3

मैंने लिनक्स (और विंडोज) पर इस तरह से पाइसरियल का उपयोग किया है, कोई समस्या नहीं है!

0

मैं थ्रेड बी को "ब्लॉकिंग पढ़ने" से "गैर अवरुद्ध पढ़ने/लिखने" से संशोधित करने की अनुशंसा करता हूं। थ्रेड बी आपका सीरियल पोर्ट "डेमन" बन जाएगा।

थ्रेड ए एक दोस्ताना उपयोगकर्ता इंटरफ़ेस के लिए पूर्ण गति से चला सकता है या कोई वास्तविक समय ऑपरेशन कर सकता है।

थ्रेड ए सीरियल पोर्ट पर सीधे लिखने की बजाय थ्रेड बी को एक संदेश लिख देगा। यदि संदेशों का आकार/आवृत्ति कम है, तो संदेश के लिए एक सरल साझा बफर और ध्वज यह इंगित करने के लिए कि एक नया संदेश मौजूद होगा। यदि आपको उच्च प्रदर्शन की आवश्यकता है, तो आपको एक स्टैक का उपयोग करना चाहिए। यह वास्तव में केवल एक सरणी का उपयोग करके लागू किया जाता है जो कई संदेश भेजने और दो पॉइंटर्स जमा करने के लिए पर्याप्त होता है। लेखन सूचक केवल थ्रेड ए द्वारा अपडेट किया जाता है। पढ़ा गया सूचक केवल थ्रेड बी

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

+4

दो-थ्रेड दृष्टिकोण का पूरा बिंदु यह है कि आपको कहीं भी मतदान करने की आवश्यकता नहीं है, क्योंकि पाठक धागा बस आरसीवी पर ब्लॉक करता है। – mikepurvis

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