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

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

ただいまの
回答率

90.84%

  • C#

    6289questions

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

  • Unity

    3397questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1134questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • COM

    33questions

    COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

Unity,MATLAB Simulink間でのシリアル通信について

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 440

kousei

score 8

前提・実現したいこと
Unityのオブジェクトの座標データなどを,シリアル通信を用いてSimulinkに送りたいと考えています.(最初は,落下するcubeのZ座標をSimulinkでモニタリングすることを考えています)
しかし,Unityで,もしくはSimukinkでのシリアル通信をそれぞれ調べてもよくわかりませんでした.(Simulinkでの受信は,Instrument Control ToolboxのSerial Receiveというブロックを使えばいいという事だけわかっています.)

どの様なスクリプトを書けばUnityから数値を取り出せるのでしょうか.
また,参考になりそうなWebページなどがあれば紹介していただきたいです.

一応,いろいろなサイトを参考に一応作ってみた,COMポートからの送受信をおこなえる?はずのソースコードを添付します.

どんな些細なことでも構いません,ご指導よろしくお願いします.

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

エラーメッセージ

該当のソースコード

using UnityEngine;                             //unityのデフォルトの機能を使うためのクラス
using System.Collections;                      //C#のデフォルト機能を使うためのクラス
using System.IO.Ports;                         //シリアル通信を使用するためのクラス
using System.Threading;                        //スレッド機能を利用可能にするためのクラス


public class SerialHandler : MonoBehaviour {

    public delegate void SerialDataReceivedEventHandler(string message);            //???
    public event SerialDataReceivedEventHandler OnDataReceived;                     //???


    public string portName = "COM2";
    public int baudRate = 9600;                          //要変更

    private SerialPort serialPort_;                      //serial portクラスのインスタンス生成
    private Thread thread_;                              //スレッドクラスのインスタンス生成
    private bool isRunning_ = false;                     //シリアルポートが開いているかどうか

    private string message_;
    private bool isNewMessageReceived_ = false;            //シリアルポートから値が送られてきているかどうか





    // Use this for initialization
    void Start () {
        Debug.LogWarning("Start");
        Open();
    }





    // Update is called once per frame
    void Update () {
        Debug.LogWarning("Serial-Update");
        if (isNewMessageReceived_)
        {
            OnDataReceived(message_);
        }
    }





    void OnDestroy(){
        Debug.LogWarning("OnDestroy");
        Close();
    }





    private void Open(){                               //シリアルポートを開いて、新しいスレッドを開く

        serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);     //シリアルポートインスタンス生成
        serialPort_.Open();                             //シリアルポートを開く

        isRunning_ = true;                         //開いた証としてtrueに変更

        thread_ = new Thread(Read);              //新しいスレッドを作成してread関数を実行させる
        thread_.Start();                          //thread開始
    }





    private void Read(){
        Debug.LogWarning("Read1");
        while (isRunning_ && serialPort_ != null && serialPort_.IsOpen)        //シリアルポートが開いているかつシリアルポートインスタンスが存在する
        {
            Debug.LogWarning("Read2");
            try
            {
                message_ = serialPort_.ReadLine();
                isNewMessageReceived_ = true;                     //メッセージを受け取った証として変更
                Debug.LogWarning(message_);
            }
            catch (System.Exception e)
            {
                Debug.LogWarning(e.Message);
            }
        }
    }





    private void Close(){
        isRunning_ = false;                                      //シリアルポートを閉じた証としてfalseに変更

        if (thread_ != null && thread_.IsAlive)                   //threadが存在しているなら
        {
            thread_.Join();                                      //元のスレッドの統合
        }

        if (serialPort_ != null && serialPort_.IsOpen)             //シリアルポートにインスタンスが格納されていて、シリアルポートが開いていれば
        {
            serialPort_.Close();                                //シリアルポートを閉じる
            serialPort_.Dispose();                                //バッファの解放とか?
        }
    }


    public void Write(string message){
        try
        {
            serialPort_.Write(message);
        }
        catch (System.Exception e)
        {
            Debug.LogWarning(e.Message);
        }
    }








}

試したこと

Unity上でも現在のCubeのY座標がわかるように,以下のscriptを追加しました.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class CubePosition : MonoBehaviour {


    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void Update () {

        Vector3 Cubeposi = GameObject.Find("Cube").transform.position;   //Cubeの座標取り出し

        float CubeY = Cubeposi.y;                                  //CubeのY座標を定義

        string strCubeY = CubeY.ToString();

        this.GetComponent<Text>().text = strCubeY;

    }
}

補足情報(言語/FW/ツール等のバージョンなど)

(使用しているもの)
Windows10,Unity 2017.2.0f3(64bit),C# script,Simulink(MATLAB R2015b)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • ozwk

    2017/12/13 15:23

    Unityで計算結果をファイルに書き出してMatlabで読むのではダメなんですか?

    キャンセル

  • kousei

    2017/12/15 20:39

    最終的には別のシミュレーションソフトAと連携して,Aで計算→Simulink経由でUnityへオブジェクトの座標情報を送る→Unityで表示→Unityでのオブジェクトの接地点情報を送り返す,という動作をリアルタイムで行いたいので,計算結果をファイルに書き出して後で読む,というのではだめなのです.すみません

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6289questions

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

  • Unity

    3397questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1134questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • COM

    33questions

    COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。