質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

6876閲覧

Unity(C#)でシリアル接続デバイス名の一括取得

syaroneko1114

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2017/09/09 18:46

###前提・実現したいこと

Unity(C#)でシリアル接続デバイス名の一括取得を行い、自動で適切なポートへ接続したいと考えています。
試したことに記載する手順を試したところ、以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ

NotImplementedException: The requested feature is not implemented. System.Management.ManagementClass..ctor (System.String path) (wrapper remoting-invoke-with-check) System.Management.ManagementClass:.ctor (string) GetSeial.Program.GetSerialDeviceNames () GetSeial.Program.Main (System.String[] args) GetName.Start () (at Assets/GetName.cs:13)

###該当のソースコード

C#

1//Plugin用コード 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Management; 6using System.Text; 7using System.Text.RegularExpressions; 8 9namespace GetSeial 10{ 11 public class Program 12 { 13 public string message; 14 15 public void Main(string[] args) 16 { 17 foreach (string deviceName in GetSerialDeviceNames()) 18 { 19 Console.WriteLine(deviceName); 20 message = deviceName; 21 } 22 } 23 24 IEnumerable<string> GetSerialDeviceNames() 25 { 26 var pnpEntity = new ManagementClass("Win32_PnPEntity"); 27 var comRegex = new Regex(@"\(COM[1-9][0-9]?[0-9]?\)"); // デバイス名に"(COM3)"などが入ってるものを探したい 28 29 return pnpEntity 30 .GetInstances() // 一覧を取得 31 .Cast<ManagementObject>() 32 .Select(managementObj => managementObj.GetPropertyValue("Name")) // 名前拾ってくる 33 .Where(nameObj => nameObj != null) // プロパティ値が拾えないものはnullになっているので弾く 34 .Select(nameObj => nameObj.ToString()) // 文字列に直し、 35 .Where(name => comRegex.IsMatch(name)); // 正規表現で最後のフィルタリング 36 37 } 38 39 public string GetData() 40 { 41 return message; 42 } 43 } 44}

C#

1//UnityでPluginを使用するコード 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class GetName : MonoBehaviour { 7 public static GetSeial.Program program; 8 9 public string[] args; 10 11 // Use this for initialization 12 void Start () { 13 program = new GetSeial.Program(); 14 program.Main(args); 15 } 16 17 // Update is called once per frame 18 void Update () { 19 Debug.Log(program.GetData()); 20 } 21} 22

###試したこと
Unityでのシリアル通信はこちらを参考にすることで出来ました。(ただし、ArduinoではなくMONOSTICKによるシリアル通信)

しかし、上記のサイトの方法でシリアル通信を行うには、あらかじめポート番号を調べておく必要があります。
これを自動で取得できるようにしたいと思い、C#でシリアル接続デバイス名を取得できる方法で記載されているプログラムをPlugin化して試したところ、エラーになりました。

簡単に試した手順を記載すると

  1. Pluginの作成を行う。
    Visual Studioの新規作成→プロジェクトでクラスライブラリを選択。この時.NET3.5にしておく。
  2. シリアル名取得のプログラムをコピペ。ただし、クラスのpublic化等を行った。
  3. ソリューションエクスプローラーの参照で右クリ→参照の追加でSystem.Managementを追加
  4. ビルド→ソリューションのビルドを行う。
  5. Unityで新規プロジェクトを作成し、プロジェクトビューで、「Plugins」というフォルダを作成する。
  6. E:\Users\●●\Documents\Visual Studio 2015\Projects\GetSeial\GetSeial\bin\Debug
    の中にある.dllファイルを「Plugins」フォルダに入れる。
  7. UnityでGetData関数を呼び出すためのプログラムを作成する。
  8. 実行→エラー

###補足情報(言語/FW/ツール等のバージョンなど)
Windows10
Unity 2017.1.0f3
Visual Studio Community 2015

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Unityのスクリプトは(マネージドプラグインのコードであっても)monoランタイムの上で動いているので、
System.ManagementのようなWindows固有の機能は動かないのではないでしょうか。

monoのManagementClassのコードを見ても、コンストラクタ含めてすべてのメソッドがNotImplementedException例外になっています。

Windows限定で良いのであれば、ネイティブプラグインを書けば回避できそうな気がします。

投稿2017/09/12 04:45

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syaroneko1114

2017/09/16 19:47

回答ありがとうございます。 「monoのManagementClassのコード」が見れることを知らなかったので、とても参考になりました。 ネイティブプラグインについて簡単に調べてみましたが、C/C++でシリアルポート名取得プログラムを作るのは少し難しそうだと思いました。 とりあえずの対応として、ゲーム内でポート番号の設定を行えるようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問