UNITY3D串口通信
2021/3/16??????點擊:
UNITY3D串口通信例子
using UnityEngine;
using System.Collections;
using System.IO;
using System.IO.Ports;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Text;//16進制轉(zhuǎn)換
public class U3DSerial : MonoBehaviour
{
public string portName = "COM1";
public int baudRate = 115200;
public Parity parity = Parity.None;
public int dataBits = 8;
public StopBits stopBits = StopBits.One;
SerialPort sp = null; //串口的通信類
byte[] data = new byte[128]; //用戶存儲6位數(shù)據(jù)
Thread dataReceiveThread;
string message = "$";//發(fā)送
string msg; //接收到的數(shù)據(jù)顯示在Label
string tip;//提示串口是否打開
string str1 = "";
string str2 = "";
ListliData = new List();
string str = "";
private bool shuJuZJ = false;
void Start()
{
OpenPort();
dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));//開啟線程接收數(shù)據(jù)
dataReceiveThread.Start();
}
void Update()
{
if (shuJuZJ)
{
CancelInvoke("XieCheng");//如果str還未接收完整DataReceiveFunction()扔在執(zhí)行,則快速終止調(diào)用
shuJuZJ = false;
Invoke("XieCheng", 0.1f);//可根據(jù)數(shù)據(jù)大小來定接收完整數(shù)據(jù)的時間
}
}
public void OpenPort() //打開串口
{
sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
sp.ReadTimeout = 400;
try
{
sp.Open();
Debug.Log("串口已經(jīng)打開");
tip= "串口已經(jīng)打開";
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
public void ClosePort() //關(guān)閉串口
{
try
{
sp.Close();
Debug.Log("關(guān)閉串口");
tip= "關(guān)閉串口";
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
public void WriteData(string dataStr)//寫入數(shù)據(jù)
{
if (sp.IsOpen)
{
sp.Write(dataStr);
}
}
void OnApplicationQuit()
{
ClosePort();
}
void DataReceiveFunction()
{
byte[] buffer = new byte[128];
//string str = string.Empty; //此處只執(zhí)行一次
//int index = 0;
int bytes;
while (true)
{
if (sp != null && sp.IsOpen) // sp != null &&
{
try
{
//這里面會執(zhí)行多次,以接收byte[]數(shù)據(jù)
bytes = sp.Read(buffer, 0, buffer.Length);
for (int i = 0; i < bytes; i++)
{
data[i] = buffer[i]; //將數(shù)據(jù)存入data
//str += data[i].ToString("X2") + "/"; //X表示16進制,2表示兩位數(shù)
//index++;
}
//Debug.Log("長度:" + bytes);
if (bytes == 1)
{
liData.Clear();//添加數(shù)據(jù)前,先清空泛型數(shù)組
str1 = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
liData.Add(str1);
}
else
{
str2 = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
liData.Add(str2);
str = "";
foreach (var i in liData)
{
str += i;
}
shuJuZJ = true;
}
}
catch (Exception e)
{
if (e.GetType() != typeof(ThreadAbortException))
{
//Debug.Log(e.Message);
}
}
}
Thread.Sleep(1);
}
}
void XieCheng()
{
Debug.Log("*終數(shù)據(jù):" + str);
//這里接收到的數(shù)據(jù)str,進行處理
}
void OnGUI() //按鈕發(fā)送數(shù)據(jù)
{
message = GUILayout.TextField(message);
if (GUI.Button(new Rect(100, 100, 100, 30), "Send Message"))
{
WriteData(message);
}
string by = "AA";
if (GUI.Button(new Rect(100, 150, 100, 30), "Send"))
{
WriteData(by);
}
GUILayout.Label(msg);
if (GUI.Button(new Rect(100, 200, 100, 30), "Quit"))
{
Application.Quit();
}
GUILayout.Label(tip);
}
}
- 上一篇:UNITY3D C#開發(fā)ANDROID APP調(diào)用串口 2021/3/18
- 下一篇:LINUX串口通信 2021/3/16
