Как найти доступные COM-порты?

Используйте XmlTextReader , XmlReader , XmlNodeReader и System.Xml.XPath пространство имен. И ( XPathNavigator , XPathDocument , XPathExpression , XPathnodeIterator ).

Обычно XPath делает чтение XML легче, который является тем, что Вы могли бы искать.

14
задан PeskyGnat 23 March 2012 в 15:37
поделиться

8 ответов

As others suggested, you can use WMI. You can find a sample 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);
} 
11
ответ дан 1 December 2019 в 06:05
поделиться

Framework v1.1 AFAIK не позволяет вам этого делать.

В 2.0 есть статическая функция

SerialPort.GetPortNames()

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

30
ответ дан 1 December 2019 в 06:05
поделиться

Доступные последовательные порты также можно найти в значениях в разделе реестра HKEY_LOCAL_MACHINE \ hardware \ devicemap \ serialcomm .

8
ответ дан 1 December 2019 в 06:05
поделиться

Как насчет того, чтобы задать прямой вопрос операционной системе:

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
ответ дан 1 December 2019 в 06:05
поделиться

WMI содержит много информации об оборудовании. Запрос экземпляров Win32_SerialPort .

(OTOH Я не могу вспомнить, сколько поддержки запросов WMI было в .NET 1.1.)

1
ответ дан 1 December 2019 в 06:05
поделиться

В .net v1.1 нет поддержки для связи через SerialPort. Наиболее распространенным решением для этого было использование активного элемента управления X MSCOMMCTL из установки VB6.0 (импорт в ваш проект .net в качестве компонента COM из диалогового окна добавления ссылки).

В более поздних версиях поддержка последовательного порта доступный через пространство имен System.IO.Ports. Также обратите внимание, что нет API, который предоставит вам список бесплатных портов.

Вы можете получить список всех имен портов, а затем попытаться открыть соединение. Исключение возникает, если порт уже используется.

1
ответ дан 1 December 2019 в 06:05
поделиться

Используйте функцию API QueryDosDevice . Это фрагмент VB6:

    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
0
ответ дан 1 December 2019 в 06:05
поделиться

Поскольку вы используете .net 1.1, одним из вариантов является использование элемента управления AxMSCommLib.

Вот веб-страница, которая помогла мне начать использовать элемент управления AxMSCommLib. В списке даже есть метод FindDevicePort (), который можно легко изменить.

С тех пор я переключился на System.IO.Ports, который кажется намного более надежным.

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

Joe

1
ответ дан 1 December 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: