“フレンドリー” Monoのシリアルポートの名前とそれをクロスプラットフォームに維持する

StackOverflow https://stackoverflow.com/questions/438029

質問

この質問をしました:
複数プラットフォーム用のMonoのシリアルポート(rs232)

これは関連しています:
どのように友好的になりますかWindowsのCOMポートの名前?

しかし、「フレンドリー」を手に入れたいです。そのようなことがある場合は、Windows上の名前と、おそらくLinux / mac上の名前も。

クロスプラットフォームでそれを行う方法はありますか、それとも運が悪いのですか?

これが現在のアプリで行っていることです-ネイティブC ++ win32に最適です。

http://www.naughter.com/enumser.html

いずれにせよ、それはクロスプラットフォーム配布のためのきれいな解決策のようには見えません。誰か提案はありますか?

編集-人々が私が求めていることを理解するのに苦労しているため: 例として-COM9はフレンドリ名ではありません。 「COM9-USBコネクタ」と書かれたものが欲しいまたはそのようなもの。これは上記のWin32のリンクで可能です。それは厄介でハックですが、多くの場合、エンドユーザーは、「COMn。」よりも便利な名前がなければ、私のプログラムでどのCOMポートを開く必要があるかわかりません。

役に立ちましたか?

解決

「友だち」はいませんLinuxのCOMMデバイスの名前。 Linux環境でデバイス名として/ dev / ttyS#を使用し、WindowsでCOMM#としてリストすることをお勧めします。

Linuxユーザーは用語を理解するので、心配する必要はありません。

他のヒント

SerialPort.GetPortNames()静的メソッドを検討してください。 .NET 2.0で利用可能で、Monoでも実装されているようです。 http://www.go-mono.com/docs/>mono docsページによると、GetPortNamesはMonoシリアルポートオブジェクトに存在するため、試してみます。

実装されている場合、コンピューターで使用可能なポート名を含む文字列のC#配列が返されます。これらは、基盤となるOSに関係なく使用できます。たとえば、Windowsでは、COM1、COM2、COM4などを返します。 PortName プロパティに必要な文字列を返します。

更新:

からの投稿をご覧くださいmono-devメーリングリストは、* nix環境で機能するようです。

WMIで次のクエリを試してください:

" Win32_PnPEntityから名前を選択" 「COM」を含むオブジェクトを検索します。たとえば、コンピューターにUSB-Serial Converterデバイスがインストールされています:

USB60FPW USBシリアルコンバーター(COM6)

WMIの実行を検討する必要があります。私はこれを自分で実行することはできませんでしたが、この基本的なフレームワークを組み合わせると thisでWMIオブジェクトを取得する方法の Win32_SerialPort クラスのドキュメント、何か解決できると思います。

基本的に、システム上のすべての Win32_SerialPort のコレクションを取得し、それらを繰り返し処理します。 「キャプション」、「説明」、または「名前」だけが必要な場合があります。私の最善のアドバイスは、単にブレークポイントを設定し、デバッグモードでオブジェクトのプロパティをチェックすることです。そうすれば、何が読み込まれるかを正確に把握できます。

コード:

    public static ArrayList GetComFriendlyNames()
    {
        ArrayList names = new ArrayList();
        try
        {
            ManagementObjectSearcher searcher =
              new ManagementObjectSearcher("root\\WMI",
              "SELECT InstanceName, PortName FROM MSSerial_PortName");

            foreach (ManagementObject port in searcher.Get())
            {
                names.Add(port["PortName"] + " - " + port["InstanceName"]);
            }
        }
        catch (ManagementException)
        {
        }
        return names;
    }

使用法:

        ArrayList ports = GetComFriendlyNames();
        foreach (string name in ports)
        {
            Console.WriteLine(name);
        }

出力例:

COM1-ACPI \ PNP0501 \ 1_0

COM2-ACPI \ PNP0501 \ 2_0

COM3-FTDIBUSVID_0000 + PID_0000 + 0& 0000000& 0& 0?000_0

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top