PCで利用可能なCOMポートを見つける方法は?フレームワークv1.1を使用しています。すべてのCOMポートを見つけることは可能ですか?可能であれば、問題の解決を手伝ってください。
他の人が示唆しているように、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);
}
Framework v1.1 AFAIKでは、これを行うことはできません。
2.0には静的関数があります
SerialPort.GetPortNames()
http://msdn.Microsoft.com/en-us/library/system.io.ports.serialport.getportnames.aspx
使用可能なシリアルポートは、レジストリのHKEY_LOCAL_MACHINE\hardware\devicemap\serialcomm
キーの値にもあります。
オペレーティングシステムから直接質問するのはどうですか。
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);
}
WMIには、多くのハードウェア情報が含まれています。 Win32_SerialPort のインスタンスをクエリします。
(OTOH .NET 1.1でWMIクエリがどの程度サポートされていたか思い出せません。)
.netv1.1ではSerialPort通信はサポートされていません。これに対する最も一般的な解決策は、VB6.0インストールからMSCOMMCTLアクティブXコントロールを使用することでした([参照の追加]ダイアログボックスからCOMコンポーネントとして.netプロジェクトにインポートします)。
それ以降のバージョンでは、シリアルポートのサポートはSystem.IO.Ports名前空間から利用できます。また、空きポートのリストを取得するAPIがないことに注意してください。
すべてのポート名のリストを取得してから、接続を開いてみてください。ポートがすでに使用されている場合は、例外が発生します。
多分あなたはこれが役に立つと思うでしょう?
PCのすべてのCOMポートをチェックする簡単な方法を紹介します。開始するには、次の手順に従います。
次のコードをコピーして、パブリックForm1()メソッド(自動生成)の後に貼り付けます。
private void Form1_Load(object sender, EventArgs e)
{
string[] ports = SerialPort.GetPortNames();
comboBoxCOMPORT.Items.AddRange(ports);
}
上記の方法は、仮想ポートだけでなく、EdgeportUSBからシリアルへのコンバーターでも機能します。これをプロジェクトに実装し、スムーズに動作します。さらにサポートが必要な場合はお知らせください。
.net 1.1を使用しているため、1つのオプションはAxMSCommLibコントロールを使用することです。
これは、AxMSCommLibコントロールの使用を開始するのに役立つWebページです。簡単に変更できるFindDevicePort()メソッドもリストされています。
それ以来、はるかに堅牢に見えるSystem.IO.Portsに切り替えました。
http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=32
ありがとう
ジョー
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