मुझे एक पायथन प्रोग्राम मिला है जो PySerial
मॉड्यूल के माध्यम से एक सीरियल पोर्ट से डेटा पढ़ रहा है। मुझे दो स्थितियों को ध्यान में रखने की आवश्यकता है: मुझे नहीं पता कि डेटा कितना होगा, और मुझे नहीं पता कि डेटा की अपेक्षा कब करें।PySerial का उपयोग करना डेटा के लिए प्रतीक्षा करना संभव है?
इस आधार पर मैं अनुसरण कोड snipets के साथ आया है:
#Code from main loop, spawning thread and waiting for data
s = serial.Serial(5, timeout=5) # Open COM5, 5 second timeout
s.baudrate = 19200
#Code from thread reading serial data
while 1:
tdata = s.read(500) # Read 500 characters or 5 seconds
if(tdata.__len__() > 0): #If we got data
if(self.flag_got_data is 0): #If it's the first data we recieved, store it
self.data = tdata
else: #if it's not the first, append the data
self.data += tdata
self.flag_got_data = 1
तो यह कोड पाश हमेशा के लिए डेटा सीरियल पोर्ट बंद हो रही होगी। हमें 500 वर्णों तक डेटा स्टोर करने में मदद मिलेगी, फिर ध्वज सेट करके मुख्य पाश को चेतावनी दी जाएगी। यदि कोई डेटा मौजूद नहीं है तो हम बस सोने और प्रतीक्षा करेंगे।
कोड काम कर रहा है, लेकिन मुझे 5s टाइमआउट पसंद नहीं है। मुझे इसकी आवश्यकता है क्योंकि मुझे नहीं पता कि कितना डेटा उम्मीद कर सकता है, लेकिन मुझे यह पसंद नहीं है कि यह हर 5 सेकंड में जाग रहा है, भले ही कोई डेटा मौजूद न हो।
क्या read
करने से पहले डेटा उपलब्ध होने पर जांचने का कोई तरीका है? मैं लिनक्स में select
कमांड की तरह कुछ सोच रहा हूं।
संपादित करें:
बस सोचा था कि मैं ध्यान दें था मैंने पाया कि inWaiting()
विधि, लेकिन वास्तव में यह है कि, यह सिर्फ एक सर्वेक्षण के मेरे "नींद" बदल रहा है ताकि नहीं है क्या मैं यहाँ चाहते हैं। मैं बस तब तक सोना चाहता हूं जब तक डेटा आ जाए, फिर इसे प्राप्त करें।
'time.sleep (1) 'एक सुंदर बदसूरत हैक जैसा लगता है जो आपके डेटा को प्राप्त करने में देरी का एक गुच्छा जोड़ता है। – TJD
@TJD - ऐसा कोई तर्क नहीं है, ऐसा लगता है कि यह नींद के बिना भी काम करता है, लेकिन 'data_left' बहुत अविश्वसनीय हो जाता है (1 9 वर्णों की एक स्ट्रिंग 3 के रूप में लूप होती है, फिर 10, फिर 6 "बैंक" आते हैं)। तो मैं अभी भी इसके साथ खुश नहीं हूं, लेकिन यह उस चीज़ के करीब है जो मैं सोच रहा था। डेटा तक सो जाओ, फिर डेटा पढ़ें, फिर सोने के लिए वापस जाओ। – Mike
मुझे नहीं लगता कि यह "अविश्वसनीय" कैसे है। वैसे ही बाइट्स आ रहे हैं जैसे आप उन्हें पढ़ रहे हैं।आप 'interCharTimeout' का उपयोग करना चाह सकते हैं, जो आपको यह पता लगाने देता है कि रिसीवर ने किसी भी नए बाइट को देखना बंद कर दिया है। – TJD