UniversalSerial データ形式と運用

このページでは、シリアル通信の設定項目、プラットフォームごとのポート名の違い、トラブル発生時の確認項目を説明します。

シリアル設定の一覧

Initializeで指定する設定項目の一覧です。設定値は対向デバイス(またはソフトウェア)の設定と一致させる必要があります。

設定既定値説明
Port NameCOM1ポート名。OSごとの形式は後述の表を参照
Baud Rate96001秒あたりの通信速度(ボー)。Arduinoのスケッチでは115200がよく使われる
Data Bits81文字あたりのデータビット数(5〜8)
ParityNoneパリティビット(None/Odd/Even/Mark/Space)
Stop Bits1ストップビット(1/1.5/2)
Flow ControlNoneフロー制御(None/Hardware (RTS/CTS)/Software (XON/XOFF))
Write Timeout1000書き込みのタイムアウト(ミリ秒)。Set Write Timeoutで変更
Receive Buffer Size8192受信バッファサイズ(バイト、最小1024)。Set Receive Buffer Sizeで変更
Initial DTRtrueポートを開いた時点のDTR信号の状態
Initial RTStrueポートを開いた時点のRTS信号の状態

ボーレートなどの設定が対向デバイスと一致していない場合、通信自体は成立しても受信データが文字化けします。対向デバイスの仕様を確認して設定してください。

受信モード

受信データの読み込みはバックグラウンドスレッドで行われます。Set Receive Modeで、スレッドのポーリング方法を変更できます。

Receive Mode動作用途
Lowデータがないときに10ミリ秒待機する低頻度の通信でCPU負荷を抑えたい場合
Normal常に1ミリ秒待機する(既定)通常の用途
HighスリープせずにYieldで待機する高頻度・大量の受信で遅延を最小化したい場合

受信イベント(Data Received系)はゲームスレッドで通知されるため、イベント内でUIの更新なども行えます。

データ形式と区切り文字

受信データの形式はInitializeのData Format(またはSet Data Format)で指定します。詳細はユースケースのデータ形式を切り替えるを参照してください。

Data Format受信するデータ通知されるイベント
RawBytesバイト配列Data Received
UTF8StringUTF-8文字列Data Received String
HexString16進数文字列Data Received Hex

UTF8Stringでは区切り文字(初期値\r\n)で文字列を復元します。区切り文字はSet String Delimiterで変更できます。対向デバイスが改行を送ってこないプロトコルの場合は、区切り文字の設定を対向デバイスの仕様に合わせてください。

プラットフォームごとのポート名

ポート名の形式はOSごとに異なります。

プラットフォームポート名の例列挙の対象
WindowsCOM3、COM5接続済みのCOMポート(SetupAPI)
Maccu.usbmodemXXXX、cu.usbserial-XXXXコールアウトデバイス(cu.で始まる名前)
LinuxttyUSB0、ttyACM0、by-idのパス名/dev/ttyUSB*、/dev/ttyACM*などのほか/dev/serial/by-id/も

MacとLinuxでは、ポート名を/dev/を省略したデバイス名だけで指定できます(自動的に補完されます)。Linuxのby-idのパス名は、USB機器を差すポートが変わっても同じ名前になるため、ポート名が頻繁に変わる環境で便利です。

Get Available Serial Portsは開けないポートを除外して返します。Linuxでは、現在のユーザーにポートを開く権限がない場合、そのポートは一覧に表示されません。必要に応じて、OS側の設定(シリアルポートを使用するグループへのユーザー追加など)を確認してください。

ポートの排他

多くのOSでは、1つのシリアルポートを同時に開けるアプリケーションは1つです。UniversalSerialも例外ではありません。

  • Windowsでは、Arduino IDEのシリアルモニターなど、ほかのアプリケーションがポートを開いている間はOpenに失敗し、Errorイベントが発生します。
  • 通信の動作確認でArduino IDEのシリアルモニターを使ったあとは、Unreal EngineでOpenする前にモニターを閉じてください。

トラブルシューティング

症状確認する項目関連情報
ポートが開けないデバイスが接続されているか。ほかのアプリがポートを占有していないか。ポート名が正しいかクイックスタートのエラー時の確認
Get Available Serial Portsが空になるデバイスが認識されているか(OSのデバイスマネージャー等で確認)。Linuxではポートを開く権限があるかこのページの「プラットフォームごとのポート名」
受信データが文字化けするボーレート・データビット・パリティ・ストップビットが対向デバイスと一致しているかこのページの「シリアル設定の一覧」
文字列が受信できないData FormatがUTF8Stringか。対向デバイスが区切り文字(既定は\r\n)を送っているかデータ形式を切り替える
受信した文字列が途中で切れる区切り文字の設定が対向デバイスと一致しているか。Set String Delimiterで確認このページの「データ形式と区切り文字」
接続直後の送信に応答がないArduinoなど、ポートを開いたときにリセットされるデバイスはないか。1〜2秒待ってから再送するクイックスタート
高頻度の受信で取りこぼしがあるSet Receive ModeをHighにする。Set Receive Buffer Sizeでバッファを大きくするこのページの「受信モード」
送信したのにデバイスが反応しない接続中に送信しているか(未接続の送信は警告ログのみ)。Send String UTF8のAdd Delimiterが対向仕様と合うかBlueprint APIリファレンス
PIE終了後にポートが開いたままになるEndPlayでCloseを呼んでいるかクイックスタートの通信を終了する

原因を切り分けるには、ErrorイベントのError Messageを出力する構成も有効です。プラグイン内部のログは、出力ログでLogUniversalSerialカテゴリを検索すると確認できます。

注意事項

  • 対応プラットフォームはWindows、Mac、Linuxです。AndroidとiOSには対応していません。
  • プラグインは各OSのAPIを直接使用しています。そのため、古いオペレーティングシステムでは予期しない動作が発生する可能性があります。お使いの環境で動作するかは、Testerアプリで事前に確認してください。
  • 受信処理はバックグラウンドスレッドで行われますが、受信イベントはゲームスレッドで通知されます。
  • 1つのSerial Port Managerで扱えるポートは1つです。複数のポートを使用する場合は、ポートごとにマネージャーを作成してください。