2008-10-12 22 views
17

क्या कोई धारावाहिक COM पोर्ट पहले से खुला/उपयोग किया जा रहा है, तो प्रोग्रामेटिक रूप से जांचने का कोई आसान तरीका है?सी # जांचें कि क्या एक COM (सीरियल) पोर्ट पहले से ही खुला है

आम तौर पर मैं प्रयोग करेंगे:

try 
{ 
    // open port 
} 
catch (Exception ex) 
{ 
    // handle the exception 
} 

हालांकि, मैं प्रोग्राम के जांच करना चाहते हैं तो मैं एक और COM पोर्ट या कुछ इस तरह उपयोग करने का प्रयास कर सकते हैं।

उत्तर

11

मुझे किसी डिवाइस की खोज करने के लिए कुछ समय पहले कुछ चाहिए था।

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

var portNames = SerialPort.GetPortNames(); 

foreach(var port in portNames) { 
    //Try for every portName and break on the first working 
} 
+4

मैं वास्तव में एक अधिक 'सुरुचिपूर्ण' समाधान के लिए उम्मीद कर रही थी पर ... लेकिन जब सब कुछ विफल ' कार्यक्रम को काम करने के लिए संभव माध्यमों का उपयोग करें! –

+1

किसी ऐसे व्यक्ति के लिए स्पष्ट होना जो सीरियलपोर्ट व्यवहार को नहीं जानता है, उपर्युक्त उत्तर बंदरगाह का उपयोग नहीं करता है। खोलें जो कॉलर ने बंदरगाह खोला है या नहीं, अगर कोई अन्य अनुप्रयोग कहता है तो नहीं - इसके लिए संवाद करने का प्रयास बंदरगाह बनाया जाना चाहिए और एक अपवाद फेंक दिया - उपयोग में बंदरगाह, पहुंच से इनकार कर दिया। – Ken

1

SerialPort class एक Open विधि है, जो कुछ अपवादों को छोड़कर फेंक होगा। उपर्युक्त संदर्भ में विस्तृत उदाहरण हैं।

यह भी देखें, IsOpen संपत्ति।

एक साधारण परीक्षण:

using System; 
using System.IO.Ports; 
using System.Collections.Generic; 
using System.Text; 

namespace SerPort1 
{ 
class Program 
{ 
    static private SerialPort MyPort; 
    static void Main(string[] args) 
    { 
     MyPort = new SerialPort("COM1"); 
     OpenMyPort(); 
     Console.WriteLine("BaudRate {0}", MyPort.BaudRate); 
     OpenMyPort(); 
     MyPort.Close(); 
     Console.ReadLine(); 
    } 

    private static void OpenMyPort() 
    { 
     try 
     { 
      MyPort.Open(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Error opening my port: {0}", ex.Message); 
     } 
    } 
    } 
} 
+7

ओपन ओपन() विधि को कभी भी बुलाया जाने पर IsOpen केवल तभी होगा। यह नहीं कहेंगे कि बंदरगाह किसी अन्य ऐप द्वारा खोला गया है या नहीं। –

+0

यदि आप मौजूद नहीं हैं तो आप com1 को कैसे छोड़ सकते हैं? –

+0

उदाहरण COM1 को केवल एक चित्रण के रूप में उपयोग करता है। एक गैर-मौजूदा डिवाइस सीरियलपोर्ट कन्स्ट्रक्टर को IOException बढ़ाने के लिए कारण देगा: "निर्दिष्ट पोर्ट नहीं मिला या खोला नहीं जा सका"। – gimel

-2

आप कोड folloing कोशिश कर सकते हैं की जाँच करने के लिए एक बंदरगाह पहले से ही खुला है या नहीं। मैं मान रहा हूं कि आप निश्चित रूप से नहीं जानते कि आप किस पोर्ट को देखना चाहते हैं।

foreach (var portName in Serial.GetPortNames() 
{ 
    SerialPort port = new SerialPort(portName); 
    if (port.IsOpen){ 
    /** do something **/ 
    } 
    else { 
    /** do something **/ 
    } 
} 
+10

यह अच्छा होगा अगर लोगों ने कहा कि वे क्यों गिराए गए हैं, इसलिए अन्य लोग जान सकते हैं कि यह गलत क्यों है। मुझे लगता है कि यह कारण है: ओपन() विधि को कभी भी बुलाया जाने पर IsOpen केवल तभी होगा। यह नहीं कहेंगे कि बंदरगाह किसी अन्य ऐप द्वारा खोला गया है या नहीं। - मार्क सीडाडे अक्टूबर 12 '08 को 14:28 – jcmcbeth

+0

@jcmcbeth, आप सही हैं। – Geerten

+0

यदि कॉमपोर्ट बिलकुल अस्तित्व में नहीं है, तो पोर्ट 20 कहें, आप अभी भी जांच सकते हैं कि यह खुली वापसी कर रहा है या नहीं और यह पोर्टर को कोशिश करने और खोलने के लिए डेवलपर को गुमराह कर सकता है ... यह जांचने के लिए सबसे अच्छा है कि पोर्ट यह मानने से पहले मौजूद है या नहीं खुला या बंद करो। – bl4kh4k

12

इस तरह मैंने किया:

 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    internal static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile); 

फिर बाद में

 int dwFlagsAndAttributes = 0x40000000; 

     var portName = "COM5"; 

     var isValid = SerialPort.GetPortNames().Any(x => string.Compare(x, portName, true) == 0); 
     if (!isValid) 
      throw new System.IO.IOException(string.Format("{0} port was not found", portName)); 

     //Borrowed from Microsoft's Serial Port Open Method :) 
     SafeFileHandle hFile = CreateFile(@"\\.\" + portName, -1073741824, 0, IntPtr.Zero, 3, dwFlagsAndAttributes, IntPtr.Zero); 
     if (hFile.IsInvalid) 
      throw new System.IO.IOException(string.Format("{0} port is already open", portName)); 

     hFile.Close(); 


     using (var serialPort = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One)) 
     { 
      serialPort.Open(); 
     } 
+0

SerialPort.Open का उपयोग करने का प्रयास करते समय फेंक दिया अपवाद पकड़ने पर इसका उपयोग करने का क्या फायदा है? – jcmcbeth

+7

क्योंकि आप एप्लिकेशन के प्रवाह को नियंत्रित करने के अपवाद नहीं चाहते हैं। इसके क्लीनर को इसे संभालने से अपवाद को फेंकने की बजाए आगे समस्या को संभालने का प्रयास करना है। – Jeff

+4

@ जेफ: हालांकि, आप जोखिम चला रहे हैं कि अगर कोई सीरियल पोर्ट खोलता है तो आप तुरंत चेक करते हैं, और जब आप इसे खोलते हैं, तो आपका प्रोग्राम विस्फोट हो जाएगा। अपवादों का उपयोग करके, आप उस संभावित आपदा को रोक सकते हैं। – whatsisname

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