1. 程式人生 > >unity基礎開發----unity串列埠通訊

unity基礎開發----unity串列埠通訊

using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System;
using System.Collections.Generic;
using System.Threading;

public class PortControl : MonoBehaviour {
	public GUIText gui;
    //定義基本資訊
	public string portName = "COM2";
	public int baudRate = 9600;
	public Parity parity = Parity.None;
	public int dataBits = 8;
	public StopBits stopBits = StopBits.One;
	
	int[] data = new int[6];//用於儲存6位資料
	SerialPort sp = null;
	Thread dataReceiveThread;
    //傳送
	string message = "";
    //byte[] message=new byte[8];
	void Start()
	{
		OpenPort();
		dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));
		dataReceiveThread.Start();
	}
	
	void Update()
	{
		string str = "";
		for(int i=0; i<data.Length; i++)
		{
			str += data[i].ToString() + " ";
		}
		gui.text = str;
        Debug.Log(str);
	}
	
	public void OpenPort()
	{
		sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
		sp.ReadTimeout = 400;
		try
		{
			sp.Open();
		}
		catch(Exception ex)
		{
			Debug.Log(ex.Message);
		}
	}
	
	public void ClosePort()
	{
		try
		{
			sp.Close();
		}
		catch(Exception ex)
		{
			Debug.Log(ex.Message);
		}
	}

	public void WriteData(string dataStr)
	{
		if(sp.IsOpen)
		{
			sp.Write(dataStr);
		}

	}
	

	void OnApplicationQuit()
	{
		ClosePort ();
	}
	
	
	void DataReceiveFunction()
	{
		byte[] buffer = new byte[128];
		int bytes = 0;
        //定義協議
		int flag0 = 0xFF;
		int flag1 = 0xAA;
		int index = 0;//用於記錄此時的資料次序
		while (true)
		{
			if (sp != null && sp.IsOpen)
			{
				try
				{
					bytes = sp.Read(buffer, 0, buffer.Length);
					for(int i=0; i<bytes; i++)
					{

						if(buffer[i]==flag0 || buffer[i]==flag1)
						{
							index = 0;//次序歸0 
							continue;
						}
						else
						{
							if(index>=data.Length)	index = data.Length-1;//理論上不應該會進入此判斷,但是由於傳輸的誤碼,導致資料的丟失,使得標誌位與資料個數出錯
							data[index] = buffer[i];//將資料存入data中
							index++;
						}

					}
				}
				catch (Exception ex)
				{
					if (ex.GetType() != typeof(ThreadAbortException))
					{
						Debug.Log(ex.Message);
					}
				}
			}
			Thread.Sleep(10);
		}
	}


	void OnGUI()
	{
		message = GUILayout.TextField(message);
		if(GUILayout.Button("Send Message"))
		{
			WriteData(message);
		}
        string by=  "XX AA 03 31 20 51 00 00";
        if (GUILayout.Button("Send",GUILayout.Height(50)))
        {
            WriteData(by);
        }
	}

}