2013-07-11 10 views
5

मैं हाल ही में सीरियलपोर्ट क्लास के साथ काम कर रहा हूं। वर्तमान में मैं यह जांचने का सही तरीका जानने का प्रयास कर रहा हूं कि कोई डिवाइस मेरे द्वारा उपयोग किए जाने वाले कॉम पोर्ट से कनेक्ट है या नहीं। क्या यह जांचने का कोई उचित तरीका है कि कोई डिवाइस कॉम पोर्ट से कनेक्ट है या नहीं? मेरी वर्तमान विधि निम्नानुसार है:सी # सीरियल पोर्ट जांचें कि डिवाइस कनेक्ट किया गया है

  while (isReading == true) 
      { 
       try 
       { 
        received += serialPort.ReadExisting(); 

        if (received.Contains('>')) 
         isReading = false; 
       } 
       catch (Exception e) 
       { 

       } 
       if (tick == 10000) 
        if (received == "") 
        { 
         Console.WriteLine("No Data Received. Device isn't connected."); 
         isReading = false; 
        } 
       tick++; 
      } 
      Console.WriteLine(received); 

यह काम करता है लेकिन मुझे लगता है कि यह थोड़ा हैकी और अविश्वसनीय है। यदि आवश्यकता हो तो मैं इसे रख सकता हूं लेकिन अगर ऐसा करने का कोई उचित विकल्प है तो मैं इसे पसंद करूंगा।

संपादित करें: मुझे वास्तव में विश्वसनीय मान सुनिश्चित करने के लिए टिक मूल्य को लगभग 10,000 तक सेट करना होगा। अन्यथा मैं अवसर पर डेटा प्राप्त करने में विफल रहता हूं। यहां तक ​​कि इसे 1000 या 5000 तक सेट करना अविश्वसनीय है। फिर भी, यह कई मशीनों में भरोसेमंद होने की गारंटी नहीं है।

+0

तुम भी उपकरण प्रोग्रामिंग कर रहे हैं? – Rubixus

+0

@ रूबिक्सस नं। यह एक चिकित्सा उपकरण है जिसे फ्लूक 5500 ए मल्टी-उत्पाद कैलिब्रेटर कहा जाता है। मैं खुद पर आंतरिक सेटिंग्स भी नहीं बदल रहा हूं। – DanteTheEgregore

+0

क्या डिवाइस प्लग-इन होने पर रजिस्ट्री में ड्राइवर को पंजीकृत करता है? क्या यह एक यूएसबी डिवाइस है? – Kcvin

उत्तर

7

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

नेट सीरियल पोर्ट वर्ग कुछ उपयोगी घटनाओं प्रदान करता है:

Serial.DataReceivedSerial.ErrorReceived और Serial.Write

आमतौर पर मैं एक निर्दिष्ट अंतराल पर एक मतदान आदेश जारी सुनिश्चित करने के लिए उपकरण कनेक्ट किया जाएगा। जब डिवाइस प्रतिक्रिया देता है तो यह DataReceived ईवेंट को आग लगा देगा, और आप तदनुसार प्रतिक्रिया (किसी भी अन्य आवश्यक डेटा के साथ) से निपट सकते हैं। इसका उपयोग प्रतिक्रिया के समय के लिए एक साधारण टाइमर या वृद्धिशील चर के संयोजन के साथ किया जा सकता है। नोट आपको ReadTimeout और WriteTimeout उचित मूल्य सेट करने की आवश्यकता होगी।यह ReadExisting और/या ReadLine विधि के साथ आपके DataReceived ईवेंट हैंडलर में उपयोग की जा सकती है।

तो, संक्षेप में प्रस्तुत करने, (छद्म कोड में)

Send Polling command, Start Timer 
Timer to CountDown for a specified time 
If Timer fires, then assume no response 
If DataRecieved fires (and expected response) assume connection 
(of course handle any specific Exceptions (e.g TimeOutException, InvalidOperationException) 
0

मैं सहमत हूं कि एक हैकी है क्योंकि किसी भी डिवाइस को जोड़ा जा सकता है और '>' भेज सकता है; लेकिन इसका मतलब यह नहीं है कि यह आपका डिवाइस है।

इसके बजाय, गतिशील हो और COM12 पोर्ट में प्लग किए गए डिवाइसों से पूछताछ के लिए SerialPort.GetPortNames और WMI Queries जैसे कुछ का उपयोग करें।

आप this उदाहरण का उपयोग शुरुआती बिंदु के रूप में कर सकते हैं।

दस्तावेज़ीकरण और उदाहरण पढ़ने के बाद, आपको कंप्यूटर और उनके कनेक्टेड COM पोर्ट पर ड्राइवरों को पंजीकृत करने वाली सभी डिवाइस जानकारी की एक सूची बनाने में सक्षम होना चाहिए।

संपादित करें:

डिवाइस पर ही दर्ज नहीं करता, के बाद से, दृश्य स्टूडियो अपनी नौकरी एक बहुत आसान बना सकता है कि के लिए product drivers को देख पर विचार करें।

+0

'>' सिर्फ टोकन चरित्र यह दर्शाता है कि डिवाइस कमांड जारी कर रहा है और सबकुछ बफर को लिखा गया है। डिवाइस कनेक्ट होने पर जांचने के लिए मेरी वर्तमान विधि एक निश्चित समय की प्रतीक्षा कर रही है और फिर प्राप्त होने पर जांचने से केवल खाली स्ट्रिंग की तुलना में कुछ भी अधिक होता है। समस्या यह है कि एक अच्छे कंप्यूटर पर, किसी भी डेटा प्राप्त होने से पहले टिक मूल्य 10,000 गुना बढ़ सकता है। यह ऐसा कुछ नहीं है जिसे मैं आसानी से निर्भर कर सकता हूं। – DanteTheEgregore

+0

यह विधि केवल यूएसबी धारावाहिक उपकरणों के साथ काम करती है, आरएस 232 नहीं, जो ओपी निर्दिष्ट है। – Rubixus

+0

@ रूबिक्सस मैंने जो उदाहरण दिया है वह है। आप उन डिवाइसों के साथ डब्ल्यूएमआई प्रश्नों का उपयोग कर सकते हैं जिनमें ड्राइवर स्थापित हैं। जब ड्राइवर स्थापित होता है, तो यह आपके डिवाइस मैनेजर में दिखाई देगा। यदि यह आपके डिवाइस मैनेजर में है, तो आप इसे WMI क्वेरीज़ का उपयोग करके पा सकते हैं। तो आपकी टिप्पणी भी अमान्य है। – Kcvin

2

दुर्भाग्यवश धारावाहिक बंदरगाहों के साथ, यह निर्धारित करने का कोई उचित तरीका नहीं है कि कोई निश्चित डिवाइस कनेक्ट है या नहीं। आप एक जादू संदेश लिख सकते हैं कि केवल आपका डिवाइस सही ढंग से जवाब देगा, लेकिन जैसा कि this answer में वर्णित है, यह विधि अन्य कनेक्टेड डिवाइसों के लिए समस्याएं पैदा कर सकती है।

आखिरकार, आपको सही पोर्ट का चयन करने वाले उपयोगकर्ता पर निर्भर होना होगा।

इसके अलावा, यदि आप डिवाइस से कनेक्शन खोना चाहते हैं, तो आप केवल तब ही जानेंगे जब आप इसे पढ़ने/लिखने में विफल रहते हैं। इस मामले में, बस एक LostConnection घटना फेंक दें।

+0

यदि डिवाइस में ड्राइवर है, तो आप मेरे उत्तर में उल्लिखित WMI क्वेरी का उपयोग कर डिवाइस की पहचान कर सकते हैं। यह जवाब भ्रामक है। यदि उसके पास ड्राइवर नहीं है, तो आप ड्राइवर लिखना सीख सकते हैं, इसे स्वयं लिख सकते हैं, और डिवाइस का पता लगा सकते हैं। – Kcvin

+0

@ एनईटीस्केप आरएस 232 उपकरणों के लिए, डब्ल्यूएमआई प्रश्न काम नहीं करेंगे। – Rubixus

+1

@ नेटस्केप मैं जवाब के भ्रामक विश्वास पर विश्वास नहीं करता हूं। वह एक महान बिंदु बनाता है। सीरियल कनेक्शन बेहद iffy हैं। वे काम करना मुश्किल हो सकता है। ड्राइवर्स 'वास्तव में एक विकल्प नहीं हैं। – DanteTheEgregore

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