Вопрос по c#, serial-port – Как найти доступные COM-порты?

14

Как найти доступные COM-порты на моем ПК? Я использую Framework v1.1. Можно ли найти все COM-порты? Если возможно, помогите мне решить проблему.

Ваш Ответ

9   ответов
1

Win32_SerialPort.

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

1

одним из вариантов является использование элемента управления AxMSCommLib.

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

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

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

Спасибо

Джо

1

Я показываю вам простой способ проверить все COM-порты на вашем ПК. Для начала выполните следующие действия:

Create a WinForms application in Visual Studio. Darg and drop a comboBox in your form and name it comboBoxCOMPORT

Copy the following code and paste after the public Form1() method (autogenerated).

private void Form1_Load(object sender, EventArgs e)
{
    string[] ports = SerialPort.GetPortNames();        
   comboBoxCOMPORT.Items.AddRange(ports);
}
Run the app and click on drop down arrow on the comboBox to reveal all the available COM PORTS.

Вышеуказанный метод работает как для Edgeport USB-последовательных преобразователей, так и для виртуальных портов. Я реализовал это в своем проекте и работает гладко. Дайте мне знать, если я смогу оказать дальнейшую помощь.

0

QueryDosDevice API функция. Это фрагмент 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
3

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);
}
Спасибо. Это работает как шарм.
ОК ... есть подвох! Это скажет вам, если порт доступен для приложения. Если порт захвачен другим приложением, функция PortExists вернет false. Если вы хотите получить список портов, доступных на аппаратном уровне (даже если они захвачены другими приложениями), тогда PInvoke GetDefaultCommConfig (msdn.microsoft.com/en-us/library/aa363262(VS.85).aspx).
30

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

SerialPort.GetPortNames()

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

Драйверы установлены, и к ним может подключаться другое программное обеспечение, включая гипертерминал. Это FTDI USB-устройства с последовательным интерфейсом. Я закончил тем, что использовал QueryDosDevices из этого ответа:stackoverflow.com/questions/1388871/…
Похоже, не работает для последовательных USB-устройств.
Возможно, вы неправильно установили драйвер. Это появляется в гипертерминале?
11

в 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);
} 
Для Python вы должны использовать pyserial - он имеет встроенный запрос к com-портам (см.pyserial.readthedocs.io/en/latest/tools.html - список портов)
Я получаю & quot; Доступ запрещен & quot; ошибка в .NET 4.5
Есть ли где-нибудь Python-эквивалент этого кода?
Этот код выдает ошибку в строке «foreach» на .net Framework 4.0.
1

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

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

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

8

HKEY_LOCAL_MACHINE\hardware\devicemap\serialcomm ключ в реестре.

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