おもちゃラボ

Unityで遊びを作ってます

【Unity】シリアル通信でハマるポイント3選

Unityでシリアル通信をするときに、良くハマるポイントをまとめました。案外シリアル通信には落とし穴がたくさんある・・・のです。転ばぬ先の杖ということで、ご査収ください(笑)

Unityでシリアル通信を使うときの具体的なプログラムはこちらの記事を参考にして下さい。

nn-hokuson.hatenablog.com

では、1つめの落とし穴からいきます。

シリアルポートのオープンに失敗する

ちゃんとシリアルデバイスを繋いでいるのに、SerialPort.Openでエラーになるケースです。Windowsでシリアル通信をする場合、COM[数字]という名前をよく使いますが、UnityではCOM0〜COM9までしか認識することができません。

その場合はCOMポート名を修正するのが手っ取り早いです。ポート名を変えるには「デスクトップ左下のWindowsマークを右クリック」→「デバイスマネージャ」からシリアルポート名を右クリックしてプロパティウインドウを表示します。「ポートの設定」→「詳細設定」→「COMポート番号」と進み、COM9以下のポートを選択しましょう。

f:id:nn_hokuson:20180201202240j:plain:w300   f:id:nn_hokuson:20180201202254j:plain:w300

Serialクラスを使うとコンパイルエラーがでる

Unityでは標準で.NET 2.0のサブセットを使うように設定されていますが、サブセットにはSerialPortクラスが含まれていません。そのため「using System;」としても次のようなエラーが出ます。

error CS0246: The type or namespace name `SerialPort' could not be found. Are you missing an assembly reference?

f:id:nn_hokuson:20180201202842p:plain

したがって、シリアル通信を使う場合は使用する.NETのバージョンを.NET 2.0 Subsetから.NET 2.0に変更する必要があります。

メニューバーからEdit -> Project Settings -> Playerを選択し、API Compatibility Levelを.NET 2.0に変更してください。

f:id:nn_hokuson:20170912190634p:plain:w350

通信中にフリーズする

UnityでSerialPortクラスのReadメソッドやByteToReadメソッドを使うとフリーズすることがあります。ReadLineメソッドを使うとフリーズを回避できます。

(下の記事ではReadTimeout=1としたときにReadLineがフリーズすると書かれていましたが、2018年2月現在問題なく動作しています)
qiita.com

まとめ

ということで、Unityのシリアル通信には落とし穴がたくさんあります!というお話でした。でもArduinoなど外部デバイスと通信するにはシリアル通信が手軽ですし、出来ることの幅も広がるので、積極的に使っていきたいですね〜