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

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

新規登録して質問してみよう
ただいま回答率
85.39%
Unity

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

0回答

6853閲覧

unityのSystem.IO.PortsクラスのBytesToReadが正常に動かない

daaaisuke

総合スコア34

Unity

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2016/08/24 05:48

###前提・実現したいこと
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に設定。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問