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

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

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

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

Unity3D

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

Arduino

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

Q&A

解決済

1回答

3542閲覧

ArduinoからUnityへのシリアル通信

utsu

総合スコア11

C#

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

Unity3D

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

Arduino

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

0グッド

0クリップ

投稿2019/06/10 09:08

編集2019/06/10 10:52

前提・実現したいこと

Arduinoから送られた数値をもとにUnity上のオブジェクトを回転させようと考えています。

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

考えた通りの動きはするのですが動作が非常に緩慢であり、使い物になりません。

該当のソースコード

C#(オブジェクトの回転) using System.Collections; using System.Collections.Generic; using UnityEngine; public class rot : MonoBehaviour { float speed=1.0f; public IOPort IOPort; void Update () { if (IOPort.flag == 1) { //時計回り transform.RotateAround(new Vector3(0, 0, 0), Vector3.back, speed); } } } ------------------------------------------------------------------------------------------ C#(Arduinoとのシリアル通信) using System.Collections; using System.IO.Ports; using System.Collections.Generic; using UnityEngine; public class IOPort : MonoBehaviour { int data = 0; SerialPort Port1 = new SerialPort("COM3", 9600); public int flag=0; void Start () { if (Port1.IsOpen) { Port1.Close(); } else { Port1.Open(); Port1.ReadTimeout = 1000; } } void Update () { data = Port1.ReadByte(); Debug.Log(data); if (data == 30) { flag = 1;} if (data == 40) { flag = 0;} } } -------------------------------------------------------------------------------- Arduino #define UNITY 2 void setup() { pinMode(UNITY,OUTPUT); Serial.begin(9600); } void loop() { Serial.write(30); Serial.flush(); digitalWrite(UNITY,HIGH); delay(10); digitalWrite(UNITY,LOW); delay(5000); Serial.write(40); Serial.flush(); digitalWrite(UNITY,HIGH); delay(10); digitalWrite(UNITY,LOW); delay(5000); }

試したこと

Arduinoを使わずUnityのみを用いてキー入力によるフラグ操作をすると求めていた速度で動作します

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

コンソールを確認したところ以下のエラーが表示されていました。
TimeoutException: The operation has timed-out.
System.IO.Ports.WinSerialStream.Read (System.Byte[] buffer, Int32 offset, Int32 count)

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

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

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

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

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

guest

回答1

0

ベストアンサー

data = Port1.ReadByte();

は、シリアルでなにか文字が送られてくるまで待ちになってしまいます
ここは、受信文字があるかどうかを判断して、ない場合は処理をスキップするようにすればどうでしょう

投稿2019/06/10 09:29

y_waiwai

総合スコア87749

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

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

utsu

2019/06/10 10:06

ご指摘ありがとうございます。 頂いたアドバイスを正しくとらえられているかわからないのですが以下のように訂正しました。 data = Port1.ReadByte(); if (data == 30) {flag = 1;} if (data == 40) {flag = 0;} を if (Port1.ReadByte() == 30) {flag = 1; } if (Port1.ReadByte() == 40) { flag = 0; } に変更 結果としましては速度に変化は見られませんでした。
y_waiwai

2019/06/10 10:57 編集

ReadByteは文字が来るまで待ってしまいます。 受信データが有るかどうか、のメソッドがあるのでそういうのを使いましょう BytesToReadメソッドを調べてみよう
YAmaGNZ

2019/06/10 13:49

BytesToReadはプロパティです。
utsu

2019/06/11 04:19

BytesToReadを用いたところ解決いたしました! ご指摘感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問