このページでは、UniversalSerialがBlueprintに公開するAPIを説明します。C++でも同じAPIを利用できます。各APIの使い分けはユースケースを参照してください。
API全体の関係
UniversalSerialの公開APIは、Serial Port Managerクラス(USerialPortManager)に集約されています。
| 役割 | ノード |
|---|---|
| 作成と設定 | Construct Object from Class、Initialize、各種Set系ノード |
| 接続の制御 | Open、Close、IsConnected、Set DTR、Set RTS |
| 送信 | Send Data、Send String UTF8、Send String Hex |
| ポートの調査 | Get Available Serial Ports、Find First Communicable Serial Port |
| 結果の受信 | Connectedなどの6種類のイベント |
flowchart TB
BP["Blueprint / C++"] --> M["SerialPortManager"]
M -->|"Initialize → Open"| OS["OSのシリアルAPI"]
M -->|"Send Data / Send String UTF8 / Send String Hex"| OS
OS -->|"受信スレッド"| M
M -->|"Connected / Data Received など(ゲームスレッド)"| BP
受信データの読み込みはバックグラウンドスレッドで行われ、受信イベントはゲームスレッドで通知されます。
SerialPortManagerの作成
Serial Port ManagerはBlueprintTypeのクラスです。Construct Object from ClassノードのClassにSerial Port Managerを指定して作成します。

作成したインスタンスはメンバー変数に保存してください。未保存の場合、ガベージコレクションの対象になり、通信が継続できません。
Initialize
ポート名と通信設定を指定します。Initializeは設定を保存するだけです。実際にポートを開くには、続けてOpenを実行します。
| 入力 | 既定値 | 説明 |
|---|---|---|
| Port Name | COM1 | ポート名。OSごとの形式は運用ページを参照 |
| Baud Rate | 9600 | ボーレート。対向デバイスと一致させる |
| Data Bits | 8 | データビット(5〜8) |
| Parity | None | パリティビット |
| Stop Bits | 1 | ストップビット |
| Flow Control | None | フロー制御 |
| Data Format | RawBytes | 受信データの形式 |
| Initial DTR | true | ポートを開いた時点のDTR信号の状態 |
| Initial RTS | true | ポートを開いた時点のRTS信号の状態 |
設定は対向デバイスまたはソフトウェアの設定と一致している必要があります。
Open
Initializeで保存した設定でポートを開き、受信スレッドを起動します。成功するとConnectedイベントが、失敗するとErrorイベントが発生します。
すでに接続中の場合は何も行わず、ログに警告が出力されます。
Close
ポートを閉じ、受信スレッドを停止します。Disconnectedイベントが発生します。レベルの終了時(EndPlay)に呼び出してください。
IsConnected
ポートが開いているかどうかを返します(true: 接続中、false: 切断)。
送信系ノード
| ノード | 入力 | 説明 |
|---|---|---|
| Send Data | Data(バイト配列) | バイト配列をそのまま送信する |
| Send String UTF8 | Text、Add Delimiter(既定true) | 文字列をUTF-8エンコードで送信する。trueなら区切り文字を末尾に自動追加 |
| Send String Hex | Hex Text | 16進数文字列をバイト配列に変換して送信する。バイト間のスペースは任意 |
未接続の状態で送信した場合や空のデータを送信した場合は、送信は行われずログに警告が出力されます。
Set DTR / Set RTS
DTR・RTS信号の状態を切り替えます。成功するとtrueが返ります。接続していない状態ではfalseが返ります。
Set Receive Mode / Get Receive Mode
受信スレッドのポーリング方法を指定します。
| Receive Mode | 動作 |
|---|---|
| Low | データがないときに10ミリ秒待機する |
| Normal | 常に1ミリ秒待機する |
| High | スリープせずにYieldで待機する |
Highは受信の遅延を最小化しますが、CPUの使用率が上がります。通常は既定値のNormalを使用してください。Get Receive Modeで現在の設定を取得できます。
Set系ノード(オプション設定)
次のノードは戻り値としてマネージャー自身を返すため、Initializeの前などに続けて呼び出せます。
| ノード | 入力 | 既定値 | 説明 |
|---|---|---|---|
| Set Write Timeout | Timeout Ms | 1000 | 書き込みのタイムアウト(ミリ秒) |
| Set Receive Buffer Size | Size In Bytes | 8192 | 受信バッファサイズ(最小1024) |
| Set Data Format | Format | - | 受信データの形式を変更する |
| Set String Delimiter | Delimiter | \r\n | 文字列の区切り文字を変更する |
Get Available Serial Ports
現在利用可能なシリアルポート名の一覧を返します(BlueprintPure、static)。取得したポート名はInitializeのPort Nameにそのまま渡せます。
Find First Communicable Serial Port(およびBinary版)
候補ポートを順に開き、最初に通信可能なポート名を返します。通信できない場合は空の文字列を返します。詳細な使い方はユースケースの通信可能なポートを自動で特定するを参照してください。
| 入力 | 既定値 | 説明 |
|---|---|---|
| Baud Rate 〜 RTS | - | Initializeと同じ並びの通信設定 |
| Read Timeout Ms | 50 | プローブ時の読み取りタイムアウト(ミリ秒) |
| Write Timeout Ms | 500 | プローブ時の書き込みタイムアウト(ミリ秒) |
| Receive Buffer Size | 4096 | プローブ時の受信バッファサイズ |
| Probe Command UTF8 | 空 | 各ポートへ送る文字列 |
| Expected Response UTF8 | 空 | 応答に含まれることを確認する文字列 |
| Probe Timeout Ms | 1200 | 応答の待機時間(ミリ秒) |
Find First Communicable Serial Port (Binary)は、プローブと応答確認をバイト列(Probe Data・Expected Response)で行う版です。どちらのノードも、プローブ文字列を両方空にすると「最初に開けたポート」を返します。
イベント
| イベント | 発生タイミング | 引数 |
|---|---|---|
| Connected | ポートが開かれたとき | Serial Port マネージャー自身 |
| Disconnected | ポートが閉じられたとき | Serial Port マネージャー自身 |
| Data Received | データを受信したとき | Serial Port、Data 受信したバイト配列 |
| Data Received String | 文字列を受信したとき | Serial Port、Data 受信した文字列 |
| Data Received Hex | 16進数文字列を受信したとき | Serial Port、Hex Data 16進数文字列 |
| Error | エラーが発生したとき | Serial Port、Error Message エラーの内容 |
受信イベント(Data Received・Data Received String・Data Received Hex)は、Data Formatで指定した形式に対応する1種類だけが通知されます。ほかの2つはバインドしていても通知されません。
列挙型
| 列挙型 | 値 | 用途 |
|---|---|---|
| ESerialPortParity | None / Odd / Even / Mark / Space | パリティビット |
| ESerialPortStopBits | 1 / 1.5 / 2 | ストップビット |
| ESerialPortFlowControl | None / Hardware (RTS/CTS) / Software (XON/XOFF) | フロー制御 |
| ESerialDataFormat | Raw Bytes (TArray<uint8>) / UTF-8 String / Hex String | 受信データの形式 |
| ESerialPortReceiveMode | Low / Normal / High | 受信スレッドのポーリング方法 |
C++での実装例
Arduinoと文字列で送受信する例です。Blueprintの構成と同じ要素を使用します。
void UMyActor::BeginPlay()
{
Super::BeginPlay();
// SerialPortManagerを作成し、変数に保持する
SerialPort = NewObject<USerialPortManager>();
// イベントハンドラーを設定する
SerialPort->OnConnected.AddDynamic(this, &UMyActor::OnConnected);
SerialPort->OnDisconnected.AddDynamic(this, &UMyActor::OnDisconnected);
SerialPort->OnDataReceivedString.AddDynamic(this, &UMyActor::OnDataReceivedString);
SerialPort->OnError.AddDynamic(this, &UMyActor::OnError);
// 通信設定を指定する(対向デバイスと一致させる)
SerialPort->Initialize(
TEXT("COM3"),
115200,
8,
ESerialPortParity::None,
ESerialPortStopBits::One,
ESerialPortFlowControl::None,
ESerialDataFormat::UTF8String,
true,
true);
// ポートを開く
SerialPort->Open();
}
void UMyActor::OnConnected(USerialPortManager* SerialPort)
{
// 文字列を送信する(区切り文字を自動で追加)
SerialPort->SendStringUTF8(TEXT("Hello"), true);
}
void UMyActor::OnDataReceivedString(USerialPortManager* SerialPort, const FString& Data)
{
UE_LOG(LogTemp, Log, TEXT("Received: %s"), *Data);
}
void UMyActor::OnError(USerialPortManager* SerialPort, const FString& ErrorMessage)
{
UE_LOG(LogTemp, Error, TEXT("Serial error: %s"), *ErrorMessage);
}
void UMyActor::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
if (SerialPort)
{
SerialPort->Close();
}
Super::EndPlay(EndPlayReason);
}
通信可能なポートを自動で特定する場合は、Openの前にUSerialPortManager::FindFirstCommunicableSerialPortの戻り値をInitializeのポート名に渡します。
const FString PortName = USerialPortManager::FindFirstCommunicableSerialPort(
115200, 8,
ESerialPortParity::None, ESerialPortStopBits::One, ESerialPortFlowControl::None,
50, 500, 4096, true, true,
TEXT("PING\r\n"), TEXT("PONG"), 2000);
if (!PortName.IsEmpty())
{
SerialPort->Initialize(PortName, 115200, 8,
ESerialPortParity::None, ESerialPortStopBits::One, ESerialPortFlowControl::None,
ESerialDataFormat::UTF8String, true, true);
SerialPort->Open();
}
非推奨のノード
| ノード | 扱い |
|---|---|
| Set Read Timeout | 非推奨。読み取りのタイミングはSet Receive Modeで制御する |
エディタ上では打ち消し線付きで表示されます。既存のBlueprintに含まれている場合でも動作しますが、新規に使用しないでください。
ライフサイクルと保持のまとめ
Construct Object from Classで作成したSerial Port Managerはメンバー変数で保持します。Initializeで設定を保存し、Openでポートを開きます。Openの成功・失敗はConnected・Errorイベントで確認します。- 送信は接続中のみ有効です。未接続での送信は警告ログのみで、エラーイベントは発生しません。
- 受信イベントは
Data Formatに対応する1種類だけが通知され、ゲームスレッドで実行されます。 - 不要になったら
Closeを呼び出します。呼び出さないままオブジェクトが破棄されると、ポートが開いたままになることがあります。