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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

シリアルポート

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

Unity

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

Q&A

解決済

3回答

4960閲覧

Unityでシリアル通信(送信と受信)ができない

no_naikanojo

総合スコア8

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

シリアルポート

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

Unity

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

0グッド

0クリップ

投稿2021/07/10 15:39

Vorzeというメーカーのとある高級家電がシリアル通信ができると知り、先日購入し、試しにUnityから動かしてみようとしたところうんともすんとも言わない状態で困っております。

調べたところ、Arduino等を活用するためUnityでシリアル通信をする場合、よく「受信ができない(遅い)」といった相談があるようで、そちらの解消方法も一通り試してはみたのですが、現状は変わらず送信も受信もできていない状況で、具体的には、ポートのオープンや送信については特にエラーも何らかの動作も起きず、受信についてはいつまで経っても受信ができずフリーズするのでタイムアウト時間を設けて初めて「System.TimeoutException: The operation has timed out.」を吐きます。
Unityではなく、有志の方が開発した別のプログラムではCOM3で接続が確立され送信と動作ができていましたので、家電側の不具合ではないような気がします。

何か考えられる原因はありますでしょうか?
皆様のお知恵を拝借できれば幸いです。よろしくお願いいたします。

Windows10
Visual Studio 2017
次の3つのバージョンで試してみました。
Unity2018.4.36f1
Unity2019.4.21f1
Unity2021.1.0b8
また、
BuildSettingsで「PC,Mac&Linux Standalone」 ⇒ 「Universal Windows Platform」へ
PlayerSettingsで「Api Compatibility Level」 ⇒ 「.NET 4.x」へ
COMポートの番号はデバイスマネージャーで確認済み(COM3)です。
その他、
試しにデバイスマネージャーからCOMポートの番号を変えてみたり、受信・送信バッファーを下げたりしましたが変化はありませんでした。

using System.Collections; using System.Collections.Generic; using System.IO.Ports; using UnityEngine; public class vorze : MonoBehaviour { private string[] ports; private SerialPort port; private string portName; private int baudRate; private int dataBits; private byte pistonPosition; private byte pistonSpeed; private byte[] data; private byte[] data1; // Start is called before the first frame update void Start() { //ports = SerialPort.GetPortNames(); //Debug.Log(ports); Open(); } // Update is called once per frame void Update() { } private void OnDestroy() { port.Close(); port.Dispose(); Debug.Log("end"); } void Open() { portName = "COM3"; baudRate = 9600; //19200 dataBits = 8; port = new SerialPort(portName, baudRate, Parity.None, dataBits, StopBits.One); port.Open(); //port.DtrEnable = true; //port.RtsEnable = true; //port.ReadTimeout = 100; //port.WriteTimeout = 100; pistonPosition = 100; // 0~200 pistonSpeed = 10; // 0~30(60) data = new byte[]{ 0x03, pistonPosition, pistonSpeed }; try { if (port.IsOpen) { port.Write(data, 0, data.Length); /* data1 = new byte[] { 0xF0, 0x01, 0x00 }; port.Write(data1, 0, data1.Length); var result = port.ReadByte(); Debug.Log(result); */ } } catch (System.Exception e) { Debug.Log(e); } finally { //port.Close(); //port.Dispose(); } } }

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

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

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

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

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

AbeTakashi

2021/07/10 17:02

Tera Termとか使えば問題なく通信できてるんですかね? いきなりUnityでやってるのなら、まずは切り分けでそちらから試すのがいいと思いますし、Tera Termで問題ないのであればUnity側が怪しいと考えられますが、ただこのソースコードの開示だけで具体的なアドバイスも出てこなそうな気もします。
thkana

2021/07/10 22:07

「送信ができていない」ことはどうやって確認しているのですか? ソース中 baudRate = 9600; //19200 のコメントの意味は何でしょう?
pepperleaf

2021/07/11 01:39

通信条件(ボーレート, パリティ, etc.)についての記載が無いですが、これらの確認は問題ないですか? 一致しないと通信はできません。COM3 とかは、実際の接続ポート番号になるので、実際の結線状態に依存。これも違うとダメ。 この辺の確認はどうなってるのでしょう。
no_naikanojo

2021/07/11 02:09

AbeTakashi様 ご返信ありがとうございます。TeraTermについては、お恥ずかしながら色々調べて、必要かどうかもよくわからないままcom0comというのも導入して、私なりに様々試してはみたのですが、結果的に使い方がよくわからず活用ができませんでした。 thkana様 ご返信ありがとうございます。「送信ができていないこと」については、前述のとおり、ターミナルソフトの使い方もわからぬあんぽんたんでしたので、「実機が動作しないこと」=「送信ができていないこと」と解釈していました。 また、「ソース中baudRate = 9600; //19200のコメントの意味」については、様々なサイトを見ていた時に、baudRateを19200で試している例がありましたので、昨日の時点で私も実際に19200で試したところ結果的に効果がなかった(実機が動かなかった)ことの覚書、でしかなかったのですが、本日もう一度baudRateを19200に変えて試してみたところ、送信(実機の動作)・受信ともに不都合なく動くようになりました。よろしければ回答としてご入力いただけましたら、ベストアンサーとさせていただく所存です(なお、それがご面倒であれば自己解決としたいと思います)。よろしくお願いいたします。
thkana

2021/07/11 03:01

自己解決にしといていただければいいです。 ただ、「なんだかわからないけど動くようになっちゃった」ときって、またいつ何時「なんだかわからないけど動かなくなっちゃった」にもなりかねないのがちょっとイヤですね。
guest

回答3

0

自己解決

コード中のボーレート(baudRate)を9600から19200にしたところ、送受信ができました。なお、デバイスマネージャー上では、使用したCOM3のドライバから通信条件を確認するとボーレートの設定は9600となっていました。一致させないほうが動くこともあるんですね。。難しいです。。
皆様たくさんのご回答をいただき、誠にありがとうございました。

投稿2021/07/11 04:53

no_naikanojo

総合スコア8

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

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

dodox86

2021/07/11 05:11

SerialPortクラスでも大丈夫だったのですね。解決して何よりでした。 > なお、デバイスマネージャー上では、使用したCOM3のドライバから通信条件を確認するとボーレートの設定は9600 これはその時の既定値の表示がそうであっただけで、アプリでの実行時にセットした19200bpsの通信速度が正しいはずです。
thkana

2021/07/11 07:26

> COM3のドライバから通信条件を確認するとボーレートの設定は9600 それはデフォルト値というだけでしょう。
guest

0

BuildSettingsで「PC,Mac&Linux Standalone」 ⇒ 「Universal Windows Platform」へ

とのことで、基本的にUWPアプリの場合、シリアル通信については従来のSerialPortクラスを使ったものとは違い、以下のものを使うことになります。

Windows.Devices.SerialCommunication Namespace - Microsoft Docs

UWPアプリにおけるシリアル通信のプログラミングについては、「UWP シリアル通信」などで検索してみれば参考になる記事が見つかるでしょう。ただ、今回はUnity下での利用なので、事情は複雑になるかもしれません。

反対に、ご提示の現状のコードは「PC,Mac&Linux Standalone」のセッティングであれば動く可能性があります。

尚、実機を使う前の送受信データの確認作業においてUSBシリアルケーブルなどを使ってのシリアルポートの増設が難しい場合は、次のような仮想シリアルポートドライバーを使うと便利です。
Null-modem emulator (com0com)

「com0com」で検索すれば多くの記事がヒットします。

投稿2021/07/11 03:00

dodox86

総合スコア9183

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

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

0

まずは、もう一個シリアル変換モジュールを用意し、ターミナルソフトを走らせて送信側の通信内容を見てみましょう
それで送信が正常に行われているのかを確認できます

送信が正常なら、受信側の問題とはっきりします

投稿2021/07/10 22:23

y_waiwai

総合スコア87719

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

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

no_naikanojo

2021/07/11 02:20

y_waiwai様 どこに原因があるのかはっきりさせる必要性は認識しつつも、その具体的手段がよくわからず、わけもわからずcom0comという仮想ポートを導入していましたが、もう1個シリアル変換モジュールを用意したほうがよかったのですね。大変勉強になります。結果的には自身でも理屈はわかっていないながら別口の方法で解決しそうな見込みとなりました。ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問