web-dev-qa-db-ja.com

利用可能なCOMポートを見つける方法は?

PCで利用可能なCOMポートを見つける方法は?フレームワークv1.1を使用しています。すべてのCOMポートを見つけることは可能ですか?可能であれば、問題の解決を手伝ってください。

14
RV.

他の人が示唆しているように、WMIを使用できます。サンプルを見つけることができます 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
Juanma

Framework v1.1 AFAIKでは、これを行うことはできません。

2.0には静的関数があります

SerialPort.GetPortNames()

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

30
Vanuan

使用可能なシリアルポートは、レジストリのHKEY_LOCAL_MACHINE\hardware\devicemap\serialcommキーの値にもあります。

8
Steef

オペレーティングシステムから直接質問するのはどうですか。

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
Hemant

WMIには、多くのハードウェア情報が含まれています。 Win32_SerialPort のインスタンスをクエリします。

(OTOH .NET 1.1でWMIクエリがどの程度サポートされていたか思い出せません。)

1
Richard

.netv1.1ではSerialPort通信はサポートされていません。これに対する最も一般的な解決策は、VB6.0インストールからMSCOMMCTLアクティブXコントロールを使用することでした([参照の追加]ダイアログボックスからCOMコンポーネントとして.netプロジェクトにインポートします)。

それ以降のバージョンでは、シリアルポートのサポートはSystem.IO.Ports名前空間から利用できます。また、空きポートのリストを取得するAPIがないことに注意してください。

すべてのポート名のリストを取得してから、接続を開いてみてください。ポートがすでに使用されている場合は、例外が発生します。

1
Sesh

多分あなたはこれが役に立つと思うでしょう?

PCのすべてのCOMポートをチェックする簡単な方法を紹介します。開始するには、次の手順に従います。

  1. VisualStudioでWinFormsアプリケーションを作成します。
  2. フォームにcomboBoxをダーグアンドドロップし、comboBoxCOMPORTという名前を付けます
  3. 次のコードをコピーして、パブリックForm1()メソッド(自動生成)の後に貼り付けます。

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] ports = SerialPort.GetPortNames();        
       comboBoxCOMPORT.Items.AddRange(ports);
    }
    
  4. アプリを実行し、コンボボックスのドロップダウン矢印をクリックして、使用可能なすべてのCOMポートを表示します。

上記の方法は、仮想ポートだけでなく、EdgeportUSBからシリアルへのコンバーターでも機能します。これをプロジェクトに実装し、スムーズに動作します。さらにサポートが必要な場合はお知らせください。

1
Aishwarya

.net 1.1を使用しているため、1つのオプションはAxMSCommLibコントロールを使用することです。

これは、AxMSCommLibコントロールの使用を開始するのに役立つWebページです。簡単に変更できるFindDevicePort()メソッドもリストされています。

それ以来、はるかに堅牢に見えるSystem.IO.Portsに切り替えました。

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

ありがとう

ジョー

1
Joe Pitz

QueryDosDeviceAPI関数を使用します。これは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
wqw