Reading data from serial port causes unity to hang
Hi all, I have a script that gets values from a serial port from an Arduino, however when I hit play, unity editor hangs. How do I fix this? Thanks!
(this is my code for unity)
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System.IO;
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public class musicScrip : MonoBehaviour {
private float amount;
private int var1;
private int var2;
private int var3;
SerialPort sp = new SerialPort("COM7", 9600);
void Start ()
{
sp.Open();
sp.ReadTimeout = 100;
}
void Update ()
{
if (sp.IsOpen) //youtube tutorial's method
{
try
{
serialEvent (sp);
}
catch (System.Exception)
{
throw;
}
}
}
void serialEvent(SerialPort myPort)
{
string myString = myPort.ReadLine(); //the ascii value of the "|" character
if(myString != null)
{
myString = myString.Trim(); //remove whitespace around our values
string[] inputs = myString.Substring(2, myString.Length-4).Split(',');
//now assign your values in processing
if(inputs.Length == 3)
{
var1 = Int32.Parse(inputs[0]);
var2 = Int32.Parse(inputs[1]);
var3 = Int32.Parse(inputs[2]);
Debug.Log(var1);
}
}
}
}
@DaveA hi, I saw that you had success with preventing unity from hanging when running the code to read data from the serial port, would you $$anonymous$$d taking a look at my code? Thanks!
Answer by raziel_anarki · Feb 10, 2016 at 04:27 PM
i'm using a similar code for reading from the arduino.
the main difference is that i've set
serialPort.ReadTimeout = 1;
this means, that the ReadLine will only wait this long (i think it's in msec units) for data.
with such a short timeout, it's possible that ReadLine will find an empty buffer, and throw a TimeoutException so instead i've wrapped it in a try-catch block like this
try
{
Debug.Log ("Read " + serialPort.ReadLine ());
// do other stuff with the data
}
catch (TimeoutException e)
{
// no-op, just to silence the timeouts.
// (my arduino sends 12-16 byte packets every 0.1 secs)
}
In which namespace can I find TimeoutException ? System.ServiceProcess doesn't seem to exist in Unity3D.