1

次のコードは、3つのシリアルポート(com3、com4、およびcom5)のみを返します。アクセスしたいファームウェアは、USBプラグマルチプライヤにあります。このマルチプライヤーのシリアルポートにアクセスするにはどうすればよいですか?また、情報を送信したいファームウェアを含む特定のUSBを特定するにはどうすればよいですか?

using System;
using System.IO.Ports;

namespace SerialPortExample
{
    class SerialPortExample
    {
        public static void Main()
        {
            string[] ports = SerialPort.GetPortNames();
            Console.WriteLine("The following serial ports were found:");
            foreach (string port in ports)
            {
                Console.WriteLine(port);
            }
            Console.ReadLine();
        }
    }
}

よろしくお願いします!

4

2 に答える 2

2

これは非常に大きなユーザビリティの問題であり、USBドライバがショートカットを使用し、シリアルポートをエミュレートしてインターフェイスを容易にすることが原因です。シリアルポートは非​​常に原始的なデバイスであるため、APIは非常に使いやすくなっています。しかし、プラグアンドプレイのサポートがないため、適切な通知を受け取る方法はありません。ドライバーは任意のポート番号を選択するだけで、それがどれであるかを判断するのはユーザーの責任です。試行錯誤。これは以前は問題ではありませんでした。シリアルポートには、COMポート名で明確にラベル付けされたコネクタがマシンの背面パネルに取り付けられていました。

WMIからある程度のマイレージを得ることができる可能性があります。これにより、 Win32_SerialPortクエリを使用してシリアルポートデバイスを列挙できます。あなたが得るものはかなり予測不可能です、それはデータを供給するドライバーに完全に依存します。これを試す最良の方法は、WMIコードクリエーターユーティリティを使用することです。必要なC#コードを自動生成することもできます。残念ながら、ダウンロード場所が見つかりません。これは過去数週間で削除されたようです。あなたが代替案を見つけることができることを願っています。

于 2012-08-14T13:18:17.620 に答える
0

以下のコードは、特定のポートを見つけるのに適しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Windows.Forms;
namespace MyNamespace
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass x = new MyClass();
            var com = x.GetCOMs();
            foreach (string port in com) 
            {
                Console.WriteLine(port);
            }
            Console.ReadLine();
        }

    }

    class MyClass
    {
        public List<string> GetCOMs()
        {
            List<string> coms = new List<string>();
            try
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2",
                "SELECT * FROM Win32_PnPEntity WHERE ConfigManagerErrorCode = 0");

                foreach (ManagementObject obj in searcher.Get())
                {
                    object captionObj = obj["Caption"];
                    if (captionObj != null)
                    {
                        string caption = captionObj.ToString();
                        if (caption.Contains("(COM"))
                        {
                            coms.Add(caption);
                        }
                    }
                }

                m_ParseCOMs(ref coms);
            }
            catch (ManagementException ex)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message);
                return coms;
            }

            return coms;
        }

        private void m_ParseCOMs(ref List<string> comPorts)
        {
            string[] temp;
            List<string> temp2 = new List<string>();
            int index = 0;
            foreach (string s in comPorts)
            {
                string temp3 = "";
                temp = s.Split(' ');
                temp3 += temp[temp.Length - 1] + " - ";
                for (int i = 0; i < temp.Length - 1; i++)
                {
                    temp3 += temp[i] + " ";
                }
                temp2.Insert(index, temp3);
                index++;
            }
            comPorts = temp2;
        }
    }
}
于 2012-08-14T18:15:19.410 に答える