###前提・実現したいこと
arduinoで読み取ったセンサの情報をunityに送りたい
BytesToReadという受信したデータのbyte数を返すプロパティを使って分岐をしようとしている
###発生している問題・エラーメッセージ
BytesToReadの値が0になってしまう
ardunioからシリアルポートに値を送れていることは確認済み
しかしunityでBytesToReadを使用すると受信データは0byteになってる。
###該当のソースコード
unity
C#
1using UnityEngine;//unityのデフォルトの機能を使うためのクラス 2using System.Collections;//C#の機能を使うためのクラス? 3using System.IO.Ports;//下2つはシリアル通信を行うためのクラス 4using System.Threading;//マルチスレッドを可能にするためのクラス 5 6public class SerialHandler : MonoBehaviour 7{ 8 public delegate void SerialDataReceivedEventHandler(string message);//デリゲートの宣言 9 public event SerialDataReceivedEventHandler OnDataReceived;//ondatereceivedっていうイベントを作っていると思われる。 10 11 public string portName = "/dev/cu.usbmodem1411";//arduino側と同じシリアルポートを入れる 12 public int baudRate = 9600;//arduino側と同じボーレートを入れる 13 14 private SerialPort serialPort_;//serial portクラスのインスタンス生成 15 private Thread thread_;//スレッドクラスのインスタンス生成 16 private bool isRunning_ = false;//シリアルポートが開いているかどうか 17 18 private string message_;// 19 private bool isNewMessageReceived_ = false;//シリアルポートから値が送られてきているかどうか 20 21 private Object lock_object_ = new Object(); 22 23 24 void Awake()//SerialHandlerインスタンス生成後すぐに実行される関数 25 { 26 Open(); 27 } 28 29 void Update() 30 { 31 if (isNewMessageReceived_) {//値が送られてきたら 32 OnDataReceived(message_); 33 isNewMessageReceived_ = false; 34 } 35 } 36 37 void OnDestroy() 38 { 39 Close(); 40 } 41 42 43 44 45 private void Open()//シリアルポートを開いて、新しいスレッドを開く 46 { 47 serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);//シリアルポートインスタンス生成 48 serialPort_.Open();//シリアルポートを開いて 49 serialPort_.ReadTimeout = 1; 50 51 isRunning_ = true;//開いた証としてtrueに変更 52 53 thread_ = new Thread(Read);//新しいスレッドを作成してread関数を実行させる 54 thread_.Start();//thread開始 55 } 56 57 private void Close() 58 { 59 isRunning_ = false;//シリアルポートを閉じた証としてfalseに変更 60 61 if (thread_ != null && thread_.IsAlive) {//threadが存在しているなら 62 thread_.Join();//元のスレッドの統合 63 } 64 65 if (serialPort_ != null && serialPort_.IsOpen) {//シリアルポートにインスタンスが格納されていて、シリアルポートが開いていれば 66 serialPort_.Close();//シリアルポートを閉じる 67 serialPort_.Dispose();//よくわからない 68 } 69 } 70 71 private void Read() 72 { 73 while (isRunning_ && serialPort_ != null && serialPort_.IsOpen) {//シリアルポートが開いているかつシリアルポートインスタンスが存在する 74 // System.Threading.Thread.Sleep(100); 75 Debug.LogFormat("bytes to read:{0}", serialPort_.BytesToRead); 76 if (serialPort_.BytesToRead > 0) {//受信したデータがあったら 77 lock (lock_object_) { 78 message_ = serialPort_.ReadLine();//一行ずつデータを読み込む 79 Debug.Log("message_="+message_); 80 isNewMessageReceived_ = true;//メッセージを受け取った証として変更 81 } 82 } 83 } 84 } 85 86 public void Write(string message) 87 { 88 serialPort_.Write(message);//メッセージをシリアルポートで送る 89 } 90}
arduino
c++
1#include "CurieIMU.h"//Genuino101の加速度センサを使用するためのライブラリをインクルード 2 3namespace { 4const int AVERAGE_NUM = 10;//値をある程度均一化するための数字 5const int adjustX = 5;//センサの値を調整するための定数、水平面に置いた時のズレの値 6const int adjustY = -2; 7const int adjustZ = -1; 8} 9 10void setup() 11{ 12 Serial.begin(9600);//シリアル通信スタート 13 // IMUセッティング---------------------------------------- 14 CurieIMU.begin();//加速度センサ起動 15 CurieIMU.setAccelerometerRange(2);//加速度センサのレンジ(測定範囲)の設定 16} 17 18void loop() 19{ 20 delay(16);//fps60程度に調整 21 readAccelerometer(); 22 setLed(); 23 24} 25 26 27//function---------------------------------------------- 28void readAccelerometer() 29{ 30 int axRaw = 0, ayRaw = 0, azRaw = 0; //加速度センサの値を受け取るための変数を用意 31 CurieIMU.readAccelerometer(axRaw, ayRaw, azRaw);//加速度センサの値を読み取り格納 32 int x = 0, y = 0, z = 0;//加速度センサの値を均した値を格納する変数を用意 33 //値の平均化================================ 34 for (int i = 0; i < AVERAGE_NUM; ++i) {//AVERAGE_NUMで指定した数だけ加速度を測定して平均化する 35 x += axRaw; 36 y += ayRaw; 37 z += azRaw; 38 } 39 x /= AVERAGE_NUM; 40 y /= AVERAGE_NUM; 41 z /= AVERAGE_NUM; 42 43 //========================================= 44 int angleX = map(axRaw, -16384, 16384, -90, 90); //センサで受け取った値を角度に変換 45 int angleY = map(ayRaw, -16384, 16384, -90, 90); 46 int angleZ = map(azRaw, -16384, 16384, -90, 90); 47 48 angleX += adjustX;//角度を手動で調整 49 angleY += adjustY; 50 angleZ += adjustZ; 51 52 Serial.print(angleX); 53 Serial.print("\t"); 54 Serial.print(angleY); 55 Serial.println(""); 56} 57 58void setLed() 59{ 60 if ( Serial.available() ) { 61 char mode = Serial.read(); 62 switch (mode) { 63 case '0' : digitalWrite(13, LOW); break; 64 case '1' : digitalWrite(13, HIGH); break; 65 } 66 } 67}
###試したこと
たまにbytestoreadの値が0以外になることがある。
シリアルポートのbpsは合わせてある。
unityのfpsに合わせてarduinoのfpsも約60に設定。
あなたの回答
tips
プレビュー