unity基礎開發----unity串列埠通訊
阿新 • • 發佈:2019-01-02
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); } } }