- Home /
Reading Serial data in Unity from Android app
I am using Android's SensoDuino (Official website) app to send sensory data like Accelerometer, gyro etc. using Bluetooth serial communication to Unity in PC. I am using the following code in Unity to receive data -
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System;
public class COM : MonoBehaviour {
public SerialPort sp;
public float data;
void Start () {
sp = new SerialPort("COM3", 9600,Parity.None, 8, StopBits.One);
Debug.Log ("Connection started");
if (sp != null)
{
if (sp.IsOpen)
{
sp.Close();
Debug.Log ("Closing port, because it was already open!");
}
else
{
sp.Open(); // opens the connection
// sets the timeout value before reporting error
sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
Debug.Log("Port Opened!");
}
}
else
{
if (sp.IsOpen)
{
print("Port is already open");
}
else
{
print("Port == null");
}
}
Debug.Log ("Open Connection finished running");
}
void Update () {
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort spl = (SerialPort)sender;
data = float.Parse( spl.ReadTo ("\r") ) ;
Debug.Log(data.ToString());
print ("data = " + data);
}
}
But I am not able to receive any data. The DataReceiveHandler
is not firing at all. I tried to use ReadLine()
also, but it freezes Unity.
The format by which SensoDuino sends Accelerometer data is
>1,104,0.54437256,-0.2632141,9.826126 >1,105,0.56111145,-0.279953,9.8524475 >1,106,0.54556274,-0.2632141,9.833298 >1,107,0.5515442,-0.26081848,9.841675 >1,108,0.5312042,-0.2644043,9.867996
This is a continuous stream and might be the cause of the freeze while using ReadLine()
.
Please help me to read the data.
Answer by dil33pm · Aug 31, 2015 at 12:25 PM
I have found the solution. ReadLine()
is a blocking call, so I had to use ReadByte()
to continuously read bytes and convert the data later. To reduce lag, the ReadByte()
function was called in a thread.
void recData() {
if ((sp != null) && (sp.IsOpen)) {
byte tmp;
string data = "";
string avalues="";
tmp = (byte) sp.ReadByte();
while(tmp !=255) {
data+=((char)tmp);
tmp = (byte) sp.ReadByte();
if((tmp=='>') && (data.Length > 30)){
avalues = data;
parseValues(avalues);
data="";
}
}
}
}
I have made a pretty detailed tutorial here
It a pretty ugly way and non-optimized one.
You should use an async read and read data only when available. Even if you have no memory constraint or CPU constraint.
Yes, am using a thread to read the inco$$anonymous$$g data.
Answer by unity_ail4Q-HKR3kdxg · Dec 04, 2017 at 02:58 PM
Hey. I found in your tutorial movement of your pong paddle in y-axis. I've receiving a serial data of my gyroscope through bluetooth. but its not moving. Please help us.
Your answer
Follow this Question
Related Questions
Unity accelerometer and screen/device orientation issue 0 Answers
bluetoot keyboard stopped working when i open unity 0 Answers
Is it possible to get the forward and backward movement of android device 1 Answer
Serial port IOException: access is denied 0 Answers
Move ball object based on gravity 0 Answers