Unity 串口通信
可以通过计算机管理->设备管理器,查看端口
串口通讯,通常是指的通过计算机或其他设备上的串行端口实现数据传输的过程。
定义与特点:串口通讯是按位(bit)发送和接收字节的通信方式,它将数据一位一位地顺序传输。其特点是使用的数据线少,通常只需两根线就可以实现双向通信,并且能够实现远距离通信,比如串口通信的长度可达 1200 米,而并行通信设备线总长不得超过 20 米。
工作原理:串口通信采用 UART(通用异步收发传输器)协议进行数据传输。发送端的 UART 将并行数据转换为串行数据,在数据字节前发送起始位,然后依次发送数据字节的每个 Bit,最后发送停止位。接收端的 UART 检测到起始位后开始接收数据位和停止位,并将串行数据转换为并行数据。
关键参数
每秒位数(波特率):表示每秒钟传输的位数,常见的波特率有 4800bps、9600bps、19200bps 等。波特率越高,数据传输速度越快,但也可能带来更高的误码率。
数据位:指实际传输的数据位数,可能为 5、6、7、8 位等,标准的 ASCII 码是 7 位,扩展的 ASCII 码是 8 位。
奇偶校验位:用于接收方对接收到的数据进行校验,校验方式有奇校验、偶校验等,以判断数据在传输过程中是否出现错误。
停止位:用于表示单个包的最后一位,典型的值为 1、1.5 和 2 位。停止位的位数越多,不同时钟同步的容忍程度越大,但数据传输率也越慢。
使用C# System.IO.Ports
下进行串口通讯,这边有个注意的地方就是从,net 2开始才有,如果没有命名空间,可以更改一下ProjectSetting->Player->Configuration-> API Compatibility Level
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Text;public class SerialPortBridge : MonoBehaviour
{#region 定义串口属性//定义基本信息public string portName = "COM7";//串口名public int baudRate = 115200;//波特率public Parity parity = Parity.None;//校验位public int dataBits = 8;//数据位public StopBits stopBits = StopBits.One;//停止位SerialPort sp = null;Thread dataReceiveThread;//发送的消息string message = "";public List<byte> listReceive = new List<byte>();char[] strchar = new char[100];//接收的字符信息转换为字符数组信息string str;#endregionvoid Start(){OpenPort();dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));dataReceiveThread.Start();}void Update(){}#region 创建串口,并打开串口public void OpenPort(){//创建串口sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);sp.ReadTimeout = 400;try{sp.Open();}catch (Exception ex){Debug.Log(ex.Message);}}#endregion#region 程序退出时关闭串口void OnApplicationQuit(){ClosePort();}public void ClosePort(){try{sp.Close();dataReceiveThread.Abort();}catch (Exception ex){Debug.Log(ex.Message);}}#endregion/// <summary>/// 打印接收的信息/// </summary>void PrintData(){for (int i = 0; i < listReceive.Count; i++){strchar[i] = (char)(listReceive[i]);str = new string(strchar);}Debug.Log(str);}#region 接收数据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);}#endregion}#endregion#region 发送数据public void WriteData(string dataStr){if (sp.IsOpen){sp.Write(dataStr);}}void OnGUI(){message = GUILayout.TextField(message);if (GUILayout.Button("Send Input")){WriteData(message);}string test = "AA BB 01 12345 01AB 0@ab 发送";//测试字符串if (GUILayout.Button("Send Test")){WriteData(test);}}#endregion
}
其实这边更推荐插件SerialPortUtilityPro,C#原生的限制很大,串口相关的功能这个插件都封装好了,傻瓜式使用。
直接挂一下核心组件 SerialPortUtilityPro,直接在面板上设置好需要的参数,设备号,厂商号,端口可以不填,会自动扫描,填了会主动连接设置的端口,然后ReadCompleteEventObject中去添加UnityEvent事件,去响应收到的消息。