2009-07-04 14 views
13

मेरे पीसी में उपलब्ध COM पोर्ट कैसे खोजें? मैं ढांचे v1.1 का उपयोग कर रहा हूँ। क्या सभी COM बंदरगाहों को ढूंढना संभव है? यदि संभव हो, तो समस्या को हल करने में मेरी सहायता करें।उपलब्ध COM पोर्ट कैसे खोजें?

उत्तर

11

के रूप में सुझाव दिया है, तो आप WMI का उपयोग कर सकते हैं। आप उपयोग कर रहे हैं के बाद से .net 1.1 एक ही विकल्प AxMSCommLib नियंत्रण का उपयोग करने के लिए है एक नमूना in CodeProject

try 
{ 
    ManagementObjectSearcher searcher = 
     new ManagementObjectSearcher("root\\WMI", 
     "SELECT * FROM MSSerial_PortName"); 

    foreach (ManagementObject queryObj in searcher.Get()) 
    { 
     Console.WriteLine("-----------------------------------"); 
     Console.WriteLine("MSSerial_PortName instance"); 
     Console.WriteLine("-----------------------------------"); 
     Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]); 

     Console.WriteLine("-----------------------------------"); 
     Console.WriteLine("MSSerial_PortName instance"); 
     Console.WriteLine("-----------------------------------"); 
     Console.WriteLine("PortName: {0}", queryObj["PortName"]); 

     //If the serial port's instance name contains USB 
     //it must be a USB to serial device 
     if (queryObj["InstanceName"].ToString().Contains("USB")) 
     { 
      Console.WriteLine(queryObj["PortName"] + " 
      is a USB to SERIAL adapter/converter"); 
     } 
    } 
} 
catch (ManagementException e) 
{ 
    Console.WriteLine("An error occurred while querying for WMI data: " + e.Message); 
} 
+4

यह कोड .net फ्रेमवर्क 4.0 पर "foreach" पंक्ति पर त्रुटि उत्पन्न करता है। –

+2

मुझे .NET 4.5 – Brendan

+0

पर "एक्सेस अस्वीकृत" त्रुटि मिलती है क्या इस कोड का कहीं पाइथन बराबर है? –

30

फ्रेमवर्क v1.1 AFAIK आपको ऐसा करने की अनुमति नहीं देता है।

2.0 में एक स्थिर समारोह

SerialPort.GetPortNames() 

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.getportnames.aspx

+0

यूएसबी <-> सीरियल उपकरणों के लिए काम करने के लिए .. –

+0

शायद आप ड्राइवर ठीक से स्थापित नहीं किया दिखाई नहीं देता। क्या यह हाइपरटेरमिनल में दिखाई देता है? – Vanuan

+0

ड्राइवर स्थापित हैं और अन्य सॉफ़्टवेयर उनसे कनेक्ट कर सकते हैं जिनमें हाइपरटेरमिनल भी शामिल है। ये एफटीडीआई यूएसबी <-> धारावाहिक आधारित डिवाइस हैं। मैं इस उत्तर से QueryDosDevices का उपयोग कर समाप्त हुआ: http://stackoverflow.com/questions/1388871/how-do-i-get-a-list-of-available-sialial-ports-in-win32 –

1

WMI हार्डवेयर जानकारी का एक बहुत कुछ शामिल है नहीं है। Win32_SerialPort के उदाहरणों के लिए क्वेरी।

(OTOH मुझे याद नहीं कर सकते हैं कि कितना WMI क्वेरी समर्थन .NET 1.1 में था।)

1

.net v1.1 में serialport संचार के लिए कोई समर्थन नहीं है। इसके लिए सबसे आम समाधान एक VB6.0 स्थापना से MSCOMMCTL सक्रिय एक्स नियंत्रण का उपयोग करना था (जोड़ें संदर्भ संवाद बॉक्स से COM घटक के रूप में अपने .net प्रोजेक्ट में आयात करें)।

बाद के संस्करणों में सीरियल पोर्ट समर्थन System.IO.Ports नाम स्थान के माध्यम से उपलब्ध है। कृपया ध्यान दें कि कोई एपीआई नहीं है जो आपको मुफ्त बंदरगाहों की सूची प्राप्त करेगी।

आप सभी पोर्ट नामों की एक सूची प्राप्त कर सकते हैं और फिर कनेक्शन खोलने का प्रयास कर सकते हैं। एक बंदरगाह तब होता है जब पोर्ट पहले से उपयोग में है।

0

QueryDosDevice एपीआई फ़ंक्शन का उपयोग करें।

ReDim vRet(0 To 255) 

    sBuffer = String(100000, 1) 
    Call QueryDosDevice(0, sBuffer, Len(sBuffer)) 
    sBuffer = Chr$(0) & sBuffer 
    For lIdx = 1 To 255 
     If InStr(1, sBuffer, Chr$(0) & "COM" & lIdx & Chr$(0), vbTextCompare) > 0 Then 
      vRet(lCount) = "COM" & lIdx 
      lCount = lCount + 1 
     End If 
    Next 
8

उपलब्ध सीरियल पोर्ट भी रजिस्ट्री में HKEY_LOCAL_MACHINE\hardware\devicemap\serialcomm कुंजी पर मूल्यों में पाया जा सकता: यह एक VB6 टुकड़ा है।

2

कैसे ऑपरेटिंग सिस्टम से सीधे सवाल पूछने के बारे में: दूसरों

using System; 
using System.Collections.Generic; 
using Microsoft.Win32; 
using System.Runtime.InteropServices; 
using Microsoft.Win32.SafeHandles; 

public class MyClass 
{ 
    private const uint GENERIC_ALL = 0x10000000; 
    private const uint GENERIC_READ = 0x80000000; 
    private const uint GENERIC_WRITE = 0x40000000; 
    private const uint GENERIC_EXECUTE = 0x20000000;  
    private const int OPEN_EXISTING = 3;  
    public const int INVALID_HANDLE_VALUE = -1; 

    public static void Main() 
    { 
     for (int i = 1; i <= 32; i++) 
      Console.WriteLine ("Port {0}: {1}", i, PortExists (i)); 
    } 

    private static bool PortExists (int number) { 
     SafeFileHandle h = CreateFile (@"\\.\COM" + number.ToString(), GENERIC_READ + GENERIC_WRITE, 
      0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); 

     bool portExists = !h.IsInvalid; 

     if (portExists) 
      h.Close(); 

     return portExists; 
    } 

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
    private static extern SafeFileHandle CreateFile (string lpFileName, System.UInt32 dwDesiredAccess, 
     System.UInt32 dwShareMode, IntPtr pSecurityAttributes, System.UInt32 dwCreationDisposition, 
     System.UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile); 
} 
+3

ठीक है ... कुछ पकड़ा गया है!यह आपको बताएगा कि आवेदन के लिए एक बंदरगाह उपलब्ध है या नहीं। यदि किसी अन्य ऐप द्वारा पोर्ट को कैप्चर किया जाता है, तो पोर्टएक्सिस्ट फ़ंक्शन झूठी वापसी करेगा। यदि आप हार्डवेयर में उपलब्ध बंदरगाह की सूची प्राप्त करना चाहते हैं (भले ही अन्य ऐप्स द्वारा कैप्चर किया गया हो) तो PInvoke GetDefaultCommConfig (http://msdn.microsoft.com/en-us/library/aa363262(VS.85).aspx)। – Hemant

+0

धन्यवाद। यह आकर्षण की तरह काम किया। – aldoblack

1

पा सकते हैं।

यहां एक वेब पेज है जिसने मुझे एक्सएमएस कॉमलिब नियंत्रण का उपयोग शुरू करने में सहायता की। सूचीबद्ध एक FindDevicePort() विधि भी है जिसे आसानी से संशोधित किया जा सकता है।

मैंने तब से System.IO.Ports पर स्विच किया है जो कि अधिक मजबूत प्रतीत होता है।

http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320

धन्यवाद

जो

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