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 mind taking a look at my code? Thanks!

Mark this answer as correct please if it did help.

2 Answers

2

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.

Hi, I tried to do what they mention in the post, but when I run, I get the following error:

TimeoutException: The operation has timed-out.
System.IO.Ports.WinSerialStream.Read (System.Byte buffer, Int32 offset, Int32 count)

How could the problem be?
Thank you.

if (other.tag == "Player") { // Increase the score by the collectables score value. ScoreManager.score += scoreValue; collectablesAudio = GetComponent <AudioSource> (); // Change the audio clip of the audio source to the Coin clip and play it collectablesAudio.clip = coinClip; collectablesAudio.Play (); Destroy(gameObject); /////THIS IS ALL I CHANGED AND ALL THE REST OF THE SCRIPT SHOULD FUNCTION NOW }