【Unity3D】串口通信
什么是串口呢
就是电脑的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); } } }