実現したいこと
ビルドしたUnityの実行ファイル上で、SerialPortを開いて、シリアル通信ができるようにする
前提
Unityで自作コントローラを使った音楽ゲームを制作している者です。
コントローラ側はRaspberry Pi picoを使ったもので、シリアル通信を用いて入力用デバイスにしようとしています。
下記のコードで、Unityのエディタ上では、上手くシリアル通信が出来ており、全く問題ないのですが、ビルドしてゲームの実行ファイルからシリアル通信しようとすると、反応がなくなります。
Debug.Log()などで詳しく調べたところ、どうやら51行目の「serialPort_ = new SerialPort();」のところで問題が発生している模様です。Unityのエディタ上では全く問題のない点でしたが、ビルドすると別の問題で通信ができないのでしょうか?
以下詳細
・Windows11(メモリ:16G CPU:11th Corei7)
・Unity2022.3.10f1
・RaspberryPiPico(UARTを使用した通信)
発生している問題・エラーメッセージ
ビルドしたファイル上で、このように表示されました。(スクリプト60行目)
System.IO.Ports.SerialPort::.ctor
該当のソースコード
C#
1using UnityEngine; 2using UnityEngine.UI; 3using TMPro; 4using System.IO.Ports; 5using System.Threading; 6using System; 7 8public class Lab : MonoBehaviour 9{ 10 public TextMeshProUGUI TMP; 11 public string portName = "COM3"; 12 public int baudRate = 115200; 13 14 private SerialPort serialPort_; 15 private Thread thread_; 16 private bool isRunning_ = false; 17 private string lastrcvd = ""; 18 byte rcv; 19 char tmp; 20 21 private string message_; 22 private bool isNewMessageReceived_ = false; 23 24 void Start() 25 { 26 lastrcvd = ""; 27 Open(); 28 } 29 30 void Update() 31 { 32 if (isNewMessageReceived_) 33 { 34 //OnDataReceived(message_); 35 TMP.text = tmp.ToString(); 36 } 37 } 38 39 void OnDestroy() 40 { 41 Close(); 42 } 43 44 private void Open() 45 { 46 TMP.text = portName + "," + baudRate; 47 //serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One); 48 49 try 50 { 51 serialPort_ = new SerialPort(); 52 serialPort_.PortName = portName; 53 serialPort_.BaudRate = baudRate; 54 serialPort_.Parity = Parity.None; 55 serialPort_.DataBits = 8; 56 serialPort_.StopBits = StopBits.One; 57 } 58 catch (System.Exception e) 59 { 60 TMP.text = e.Message; 61 } 62 63 try 64 { 65 serialPort_.Open(); 66 serialPort_.ReadTimeout = 5000; 67 TMP.text = "[2]"; 68 } 69 catch (Exception e) 70 { 71 serialPort_ = null; 72 return; 73 } 74 75 TMP.text = "[3]"; 76 77 isRunning_ = true; 78 79 thread_ = new Thread(Read); 80 thread_.Start(); 81 } 82 83 private void Read() 84 { 85 while (isRunning_ && serialPort_ != null && serialPort_.IsOpen) 86 { 87 try 88 { 89 rcv = (byte)serialPort_.ReadByte(); 90 91 if (rcv == '\r') 92 { 93 message_ = lastrcvd; 94 //Debug.LogFormat("textLine:{0}", message_); 95 lastrcvd = ""; 96 isNewMessageReceived_ = true; 97 } 98 else 99 { 100 tmp = (char)rcv; 101 //Debug.LogFormat("rcv:{0}", tmp.ToString()); 102 lastrcvd = lastrcvd + tmp.ToString(); 103 } 104 } 105 catch (System.Exception e) 106 { 107 Debug.LogWarning(e.Message); 108 } 109 } 110 } 111 112//追記 113void OnDestroy() 114 { 115 Debug.Log("close"); 116 Close(); 117 } 118 119private void Close() 120 { 121 isRunning_ = false; 122 123 if (thread_ != null && thread_.IsAlive) 124 { 125 thread_.Join(); 126 } 127 128 if (serialPort_ != null && serialPort_.IsOpen) 129 { 130 Debug.Log("close2"); 131 serialPort_.Close(); 132 serialPort_.Dispose(); 133 } 134 } 135 136 137
試したこと
・PlayerSettingsで「Api Compatibility Level」 ⇒ 「.NET Flamework」
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/10/13 05:14
2023/10/13 06:35
2023/10/14 06:43