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

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

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

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Unity

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

Q&A

解決済

2回答

421閲覧

Unityでシリアル通信ができない(エラーは出ず,単純にできない)

Har109f

総合スコア25

C#

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Unity

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

0グッド

0クリップ

投稿2024/01/16 06:45

編集2024/01/16 07:44

実現したいこと

Unityでシリアル通信を受信する

前提

・Unity2022
・対象プラットフォームは"Windows, Mac, Linux"に設定
・Api Compatibility Levelは,.NET Standard 2.0から.NET FrameWorksに変更済

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

主に以下二つのサイトを参考に,System.IO.Portsのみを使う方法とUniRXも使う方法それぞれ試し,細かい修正もいろいろ試したが駄目でした.シリアル通信の受信自体は他のソフトでできているので,完全にUnityの問題と思われます.ボーレートやCOMは確認済み.

https://qiita.com/Ninagawa123/items/f6595dcf788dd316be8a
https://makaroni3018.hatenablog.com/entry/2022/07/27/171524

シリアル通信はArduinoから受信していて,1秒ごとにメッセージが来るようにしました.
基本はエラーメッセージも受信データも共に表示されず,またシリアル通信のタイムアウトを設定(50ms)すると永遠にタイムアウトが起きた旨のエラーが繰り返し表示されます.

なにか原因に心当たりのあるかたがいたらご教授頂けると助かります.

【追記】
コードを追記するようご指摘を頂きました.基本的に試したことは上記サイトと全く同じなので記載しなかったのですが,直近で試したコードを追記させていただきます.
SerialPort.IsOpenなどをLogに出したところ,一応COM3を認識はしているようでした.

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.IO.Ports; 5 6public class SerialComm : MonoBehaviour 7{ 8 private SerialPort serialPort; 9 [SerializeField] 10 private string portName; 11 [SerializeField] 12 private int baudrate; 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 foreach(var port in SerialPort.GetPortNames()) 18 { 19 Debug.Log(port); 20 } 21 22 serialPort = new() 23 { 24 WriteTimeout = 50, 25 ReadTimeout = 50, 26 PortName = portName, 27 BaudRate = baudrate 28 }; 29 serialPort.Open(); 30 } 31 32 // Update is called once per frame 33 void FixedUpdate() 34 { 35 Debug.Log(serialPort.IsOpen); 36 if (serialPort.IsOpen) 37 { 38 string data = serialPort.ReadLine(); 39 Debug.Log(data); 40 } 41 } 42}

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

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

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

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

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

y_waiwai

2024/01/16 07:14

コードを提示しよう
Har109f

2024/01/16 07:43

失礼しました,本文を編集させて頂きました,
guest

回答2

0

自己解決

自己解決しました,普通にシリアル通信ができていませんでした.

C#

1SerialPort serial = new SerialPort(portName, baurate, Parity.None, 8, StopBits.One); 2serial.DtrEnable= true;

DtrEnableというプロパティを変えたら通信できました,Unity関係なかったですすみません.

Arduino Rev4とかラズピコとか,新しめのマイコンでこの問題が起きるみたいです.
自分はラズピコ使ってたのでこうなってしまったみたいです.

投稿2024/01/20 14:50

Har109f

総合スコア25

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

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

0

string data = serialPort.ReadLine();

というメソッドは、1行受信するまで待ち、受信した文字列を返す、というものです。

ReadTimeout = 50,

ってことで、その受信待ちは50msだけ、という設定となりますね

シリアル通信はArduinoから受信していて,1秒ごとにメッセージが来るようにしました.

そりゃタイムアウトになって当然です

投稿2024/01/16 10:44

y_waiwai

総合スコア87778

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問