UniversalSerial
A multi-platform plugin for serial communication in Unreal Engine.
UniversalSerial does not have a GitHub version available.
Overview
UniversalSerial is a plugin for serial communication with Arduino and microcontrollers in Unreal Engine.
Even without difficult programming knowledge, you can easily communicate with hardware using only Blueprints (visual scripting).
It’s ideal for projects that connect digital and physical worlds, such as IoT projects, interactive art, and real-world integration in games.
It also includes special functionality for use as a protocol with ObjectDeliverer published by AyumaxSoft.
By using this feature, you can take advantage of ObjectDeliverer’s packet splitting rules and DeliveryBox mechanism, expanding your range of applications.
Supported environments
- Windows: Verified on Windows 11 24H2
- Mac: Verified on Sequoia 15.5
- Linux: Verified on Ubuntu 24.04 LTS
The plugin directly uses each OS’s API to implement its functionality.
Therefore, unexpected behavior may occur on older operating systems.
We recommend checking whether it works in your environment beforehand using the tester application.
Key Features
- Automatic detection of available ports
- Detected port names can be passed directly to initialization
- Initialize with customized target port settings
- Port name
- Baud rate
- Data bits
- Parity
- Stop bits
- Flow control
- Read/write timeout
- Receive buffer size
- Three types of data transmission/reception methods
- Byte array
- UTF-8 encoded strings
- Hexadecimal UTF-8 encoded strings transmitted as byte arrays
- Delimiter settings for string transmission/reception
- Automatically adds delimiters during transmission
- Separates data by delimiters during reception to restore strings
- Reception processing in background thread
- Does not place heavy load on the game thread
Usage Examples
The following are the steps for using UniversalSerial.
Creating a SerialPortManager
First, create a SerialPortManager. From now on, you will use this created object for operations.

USerialPortManager* SerialPort = NewObject<USerialPortManager>();
Monitor SerialPortManager events
Monitor the necessary events of the SerialPortManager. You can skip unnecessary ones. The following types of events are available:
- Connection, disconnection Data reception
- Byte array
- UTF-8 string
- Hexadecimal UTF-8 string
- Error occurrence

SerialPort->OnConnected.AddDynamic(TestHelper, &USerialPortTestHelper::OnConnected);
SerialPort->OnDisconnected.AddDynamic(TestHelper, &USerialPortTestHelper::OnDisconnected);
SerialPort->OnDataReceived.AddDynamic(TestHelper, &USerialPortTestHelper::OnDataReceived);
SerialPort->OnDataReceivedString.AddDynamic(TestHelper, &USerialPortTestHelper::OnDataReceivedString);
SerialPort->OnDataReceivedHex.AddDynamic(TestHelper, &USerialPortTestHelper::OnDataReceivedHex);
SerialPort->OnError.AddDynamic(TestHelper, &USerialPortTestHelper::OnError);
Starting serial communication
Set the serial port information and then call Open to start communication.
The settings passed to Initialize must match those of the device or software you are connecting to.
You can also use SerialPortManager’s GetAvailableSerialPorts beforehand to get a list of currently available serial port names.

SerialPort->Initialize("COM1", 9600, 8, ESerialPortParity::None, ESerialPortStopBits::One, ESerialPortFlowControl::None, ESerialDataFormat::RawBytes);
Sending data
There are three methods for data transmission.
Send byte array
Sends the specified byte array.

TArray<uint8> Data = { 0x00, 0x00, 0x00 };
SerialPort->SendData(Data);
Send UTF-8 string
Sends the specified string. If AddDelimiter is set to true, a delimiter string (default: \r\n) is automatically added to the end of the string.

FString Data = TEXT("ABC");
SerialPort->SendStringUTF8(Data, true);
Send hexadecimal UTF-8 encoded string as byte array
Converts the specified hexadecimal string to a byte array and then sends it as a byte array.

// 文字列形式でバイト配列を作成(間のスペースはあってもなくても可)
FString Data = TEXT("AA BB CC 01 02 03");
SerialPort->SendStringHex(Data);
Data reception
You can get received values from the following three events.
Only the reception event of the type specified by Data Format during Initialize or SetDataFormat will be notified for these events.
Therefore, only one of these three events is always active. The other two will not be notified even if configured.
If the communicating device sends binary data (data that is meaningless to the human eye), we recommend specifying RawBytes and using OnDataReceived.
Alternatively, if you specify HexString and use OnDataReceivedHex, you can get byte data in string format, which is convenient when you want to display received data on screen or in log files.
If the communicating device sends strings, specify UTF-8String and use the OnDataReceivedString event.


SerialPort->OnDataReceived.AddDynamic(TestHelper, &USerialPortTestHelper::OnDataReceived);
SerialPort->OnDataReceivedString.AddDynamic(TestHelper, &USerialPortTestHelper::OnDataReceivedString);
SerialPort->OnDataReceivedHex.AddDynamic(TestHelper, &USerialPortTestHelper::OnDataReceivedHex);
Ending communication
Call Close to end communication.

SerialPort->Close();
Integration with ObjectDeliverer
Please download and use UniversalSerialOD plugin from this page.
This is currently available for free. Since plugins that integrate with other plugins violate Fab’s terms and cannot be published there, it is only available for download on this site.
Using this plugin allows UniversalSerial to be used as a protocol for ObjectDeliverer.
To use this integration feature, the following three plugins must be installed:
- ObjectDeliverer
- UniversalSerial
- UniversalSerialOD This integration feature provides the following benefits to your project:
- In serial communication, you can use ObjectDeliverer’s packet splitting rules and DeliveryBox mechanism
- When creating communication functionality with devices, if you don’t have the device, you can create a mock using TCP/IP or other protocols and switch communication methods to proceed with development
To use it, simply insert “Create Protocol Serial Port” into the Start method of ObjectDelivererManager.
After that, you can perform serial communication transmission and reception using the ObjectDeliverer functionality.

Please refer to the UniversalODSerialUMG asset in the Content folder of the UniversalSerialOD plugin, which contains an implementation example of this plugin.

Pre-purchase verification before buying the plugin

UniversalSerial directly uses OS APIs. Therefore, it may not work properly depending on your environment.
You can download a tester app from this page, and we recommend using it to verify whether serial communication is possible before purchasing.
This tester app performs serial communication using the UniversalSerial plugin. Therefore, if communication works with this app, there is a high possibility that communication will work using the plugin.
Additionally, the Blueprint implementation of this app is included in the plugin, so it will also be useful for learning how to use the plugin after purchase.
FAQ
You can check frequently asked questions here.