2009-03-13 16 views
15

मैं केवल कुछ कोड की समीक्षा कर रहा हूं जिसे मैंने सीएफ 2.0 पर सी # सीरियल पोर्ट के साथ संवाद करने के लिए लिखा था। मैं DataReceived ईवेंट का उपयोग नहीं कर रहा हूं क्योंकि यह विश्वसनीय नहीं है। MSDN states that:सीरियल पोर्ट संचार: सीरियल पोर्ट डेटा का उपयोग कर बनाम सीरियल पोर्ट बनाम

DataReceived घटना gauranteed हर बाइट प्राप्त के लिए उठाया जा नहीं है। पर कितना डेटा छोड़ा गया है यह निर्धारित करने के लिए बाइट्स टू रीड प्रॉपर्टी का उपयोग करें।

मैं पोर्ट को पढ़ने() के साथ मतदान करता हूं और एक प्रतिनिधि होता है जो डेटा को पढ़ते समय संसाधित करता है। मैंने कहीं भी पढ़ा है कि "मतदान खराब है" (कोई स्पष्टीकरण नहीं दिया गया)।

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

उत्तर

17

जिस तरह से मैंने इसे पढ़ा है, आपको प्रति बाइट एक घटना के बजाय एकाधिक बाइट्स के लिए एक ईवेंट मिल सकता है। डेटा तैयार होने पर भी मुझे एक घटना प्राप्त करने की उम्मीद है, और यह पूरी तरह से कुछ बाइट्स को "छोड़" नहीं देता है।

मैंने हमेशा इस घटना का उपयोग किया है, और इसके साथ कोई परेशानी नहीं है।

+1

बिल्कुल, यह मेरा अनुभव भी है। – Andy

7

पारंपरिक ज्ञान यह है कि "मतदान खराब है" क्योंकि यह अक्सर सीपीयू-बाध्य प्रक्रिया होने के समाप्त होता है। यदि I/O को अवरुद्ध करने के बजाय इसका उपयोग किया जाता है, तो सीपीयू अन्य प्रक्रियाओं के लिए उपलब्ध होता है जब तक कि घटना न हो।

उस ने कहा, आमतौर पर चीजों को सेट करना संभव है ताकि कोई भी पोस्ट उपलब्ध न होने पर लौटने से पहले एक मतदान (लघु) टाइमआउट के लिए इंतजार कर रहा हो। यदि एक उपयुक्त टाइमआउट चुना जाता है, तो आपका सरल मतदान लूप काफी कम CPU समय का उपयोग करता है, और अन्य प्रक्रियाएं भी चलती हैं।

मैं सी # से सीरियल पोर्ट उपयोग नहीं किया है, लेकिन मैं एक अनुमान है कि क्या द्वारा

मतलब प्रलेखन DataReceived घटना प्राप्त हर बाइट के लिए उठाया जा इसकी गारंटी नहीं है खतरे जा रहा हूँ। बफर में पढ़ने के लिए कितना डेटा छोड़ा गया है यह निर्धारित करने के लिए बाइट्स टू रीड प्रॉपर्टी का उपयोग करें।

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

संपादित करें: एक पाठक धागे पर अवरुद्ध कॉल करना समग्र रूप से सबसे अच्छा जवाब हो सकता है। यह तब तक मतदान नहीं कर रहा है जब तक कि पात्रों तक पहुंचने तक थ्रेड अवरुद्ध हो जाता है। आपको बफर आकारों और कुछ सीरियल पोर्ट सेटिंग्स को ट्यून करने की आवश्यकता हो सकती है यदि आपको डेटा को संसाधित करने की आवश्यकता होती है क्योंकि यह निश्चित आकार के हिस्सों के बजाय आता है।

+0

धन्यवाद मुझे लगता है कि यह समझ में आता है। मैं सीपीयू को अवरुद्ध नहीं कर रहा हूं। मेरे ऐप में उपयोगकर्ता को डिवाइस से मूल्य कैप्चर करने या इसे मैन्युअल रूप से टाइप करने में सक्षम होना चाहिए। जब ​​भी होता है, तो मतदान थ्रेड निकल जाता है। – sarsnake

1

मुझे यकीन है कि अंतर्निहित सीरियल पोर्ट ड्राइवर कोड अवरोधित कॉल कॉल का उपयोग करते समय भी बाधित है।

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