什么是串口呢
就是電腦的USB口,電腦和硬件間,通過USB,將數據傳送到硬件
硬件也將數據通過USB線傳送到電腦
從而完成電腦和硬件間的交互
串口表示
COM1 COM2 COM3等等
假如電腦中已經有了COM1,那插入一個新硬件時,就會自動成為COM2
(查看接入的串口 設備管理器->通用串行總線控制器)
當然,串口號是可以更改的,只要目標串口號沒有被占用,就可以更改
(右鍵目標設備->屬性->端口設置->高級->COM端口號(P))
串口和端口的區別
串口是電腦與硬件的通信渠道
端口是軟件與軟件的通信渠道。
IP定位到電腦,在IP后面跟上端口號,定位到該電腦的軟件
如127.0.0.1:80
換一個端口號,連接的便是另一個軟件了
串口通過串口號定位到硬件設備
更改串口號便更改了通信的硬件設備
串口通常用來做什么呢
軟件通過串口,向硬件發送信息
如:軟件發送信息給單片機,單片機接收到信息后控制燈帶的變化
在Unity領域,一般是通過串口接受雷達的事件,從而完成體感交互的程序
不過雷達串口是不用手寫的
而一些控制硬件交互的程序,是需要手寫的串口通信的
串口通信是怎么通訊的呢
串口通信支持多種數據類型
如byte[],string
有了string,便可以傳遞json串,也就可以傳遞任何數據了
Unity怎么寫串口通信呢
.net提供了相關的類,寫起來也是相當方便的
這個類是Serialport
需要引入庫:using System.IO.Ports;
注意事項
1.將Unity3D的切換成Api Compatibility Level改為 NET2.0(高版本Unity為.Net 4.x),否則Unity編寫SerialPort類會報錯
2.串口返回來的數據,不是在主線程的,所一需要將這些數據存儲在一個隊列中,然后在Update中檢測隊列中的數據
接下來,直接用下面代碼的回調就可以了
using UnityEngine; using System.Collections; using System.IO.Ports; using System; using System.Collections.Generic; using System.Threading; using System.Text; public class SerialPortManager : MonoBehaviour { public string portName = "COM4";//串口號 public int baudRate = 9600;//波特率 public Parity parity = Parity.None;//效驗位 public int dataBits = 8;//數據位 public StopBits stopBits = StopBits.One;//停止位 SerialPort sp = null; Thread dataReceiveThread; public List<byte> listReceive = new List<byte>(); char[] strchar = new char[100];//接收的字符信息轉換為字符數組信息 string str; void Start() { OpenPort(); dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction)); dataReceiveThread.Start(); } public void OpenPort() { //創建串口 sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits); sp.ReadTimeout = 400; try { sp.Open(); } catch (Exception ex) { Debug.Log(ex.Message); } } void OnApplicationQuit() { ClosePort(); } public void ClosePort() { try { sp.Close(); dataReceiveThread.Abort(); } catch (Exception ex) { Debug.Log(ex.Message); } } private void Update() { PrintData(); } //打印數據 void PrintData() { for (int i = 0; i < listReceive.Count; i++) { strchar[i] = (char)(listReceive[i]); str = new string(strchar); } Debug.Log(str); } //接收數據 void DataReceiveFunction() { byte[] buffer = new byte[1024]; int bytes = 0; while (true) { if (sp != null && sp.IsOpen) { try { bytes = sp.Read(buffer, 0, buffer.Length);//接收字節 if (bytes == 0) { continue; } else { string strbytes = Encoding.Default.GetString(buffer); //接受的數據 Debug.Log(strbytes); } } catch (Exception ex) { if (ex.GetType() != typeof(ThreadAbortException)) { } } } Thread.Sleep(10); } } //發送數據 public void WriteData(string dataStr) { if (sp.IsOpen) { sp.Write(dataStr); } } }