这是我本人一直在使用的串口脚本,是我封装的好的,可以在Unity里面完成串口通信功能,我觉得有东西就应该分享出来,这里仅供大家学习使用,接下来我给大家讲一下如何使用串口通信功能如何能在Unity里面接受数据,包括发送数据和接受数据。
1.首先场景个用来测试的场景快捷方式是Ctrl+N
2.新建一个空物体将SerialPortManagement脚本挂载到空物体上,代码我会放下面3.如果不知道如何看是COM几的时候可以右键此电脑进入管理
4.虚拟串口Configure Virtual Serial Port Driver破解版可自行下载这是链接:通过百度网盘分享的文件:
链接:https://pan.baidu.com/s/1hwtma4oNAZcGztev-HlPdQ
提取码:dck1
--来自百度网盘超级会员V2的分享
5.打开后这里可以添加串口例如你要使用COM7-COM8那就你点击Add pair:
6.现在打开串口调试助手,我这里是使用的是XCOM我觉得还挺好用,这个可以去网上搜很多,设置串口号
7.运行Unity后通过串口助手发送数据:注意我这里是接收的16进制的数据,这个根据你的需求可以自行更改例如转换成别的。8.废话不多说了上代码,补充一点发送数据方法可以将发送byte数组参数改成string类型这个自己测试,还有就是如果想要接收到数据改动UnityUI的画面需要放在Update里面写不然会报错!!:制作不易不妨点个关注吧嘿嘿,。
using System;
using System.Threading;
using UnityEngine;
using System.IO.Ports;
using System.Collections.Concurrent;
public class SerialPortManagement : MonoBehaviour
{
public static SerialPortManagement Instance { get; private set; }
public string PortName { get; private set; }
public int BaudRate { get; private set; }
public Parity Parity { get; private set; }
public int DataBits { get; private set; }
public StopBits StopBits { get; private set; }
public SerialPort serialPort;
public bool IsRunning { get; set; }
Thread readThread;
[HideInInspector]
public string data;
public ConcurrentQueue<string> dataQueue = new ConcurrentQueue<string>();
private void Awake()
{
if (Instance == null)//如果 Instance 为空 。
{
Instance = this; //将当前实例赋给 Instance
DontDestroyOnLoad(gameObject);//并使用 DontDestroyOnLoad 方法使其在场景切换时不被销毁
}
else
{
Destroy(gameObject);//不为空说明实例存在:避免再创建实例
}
}
private void Start()
{
Instance.Initialize("COM8", 9600, Parity.None, 8, StopBits.One);
Instance.OpenPort();
StartReading();
}
private void Update()
{
}
#region 打开串口
/// <summary>
/// 打开串口
/// </summary>
public void OpenPort()
{
if (serialPort != null && !serialPort.IsOpen)
{
try
{
serialPort.Open();
Debug.Log("串口已打开");
}
catch (Exception ex)
{
Debug.LogError("打开串口失败:" + ex.Message);
}
}
}
#endregion
#region 关闭串口
/// <summary>
/// 关闭串口
/// </summary>
public void ClosePort()
{
IsRunning = false; // 停止线程
if (readThread != null && readThread.IsAlive)
{
readThread.Join(); // 等待线程结束
}
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
Debug.Log("关闭串口");
}
}
#endregion
#region 启动线程
/// <summary>
/// 启动线程
/// </summary>
private void StartReading()
{
IsRunning = true;
readThread = new Thread(ReadPort);
readThread.Start();
}
#endregion
#region 接收串口数据
/// <summary>
/// 接收串口数据
/// </summary>
private void ReadPort()
{
while (IsRunning && serialPort.IsOpen)
{
try
{
if (serialPort.BytesToRead > 0)
{
byte[] buffer = new byte[serialPort.BytesToRead];
serialPort.Read(buffer, 0, buffer.Length);
// 处理数据
string receivedData = BitConverter.ToString(buffer).Replace("-", "");
dataQueue.Enqueue(receivedData);
Debug.Log($"接收到{receivedData}数据");
}
else
{
Thread.Sleep(10); // 等待10毫秒
}
}
catch (Exception ex)
{
Debug.LogError("读取数据时发生错误:" + ex.Message);
}
}
}
#endregion
#region 串口发送
/// <summary>
/// 串口发送
/// </summary>
/// <param name="data"></param>
private void Sender(byte[] data)
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Write(data, 0, data.Length);
Debug.Log("已发送字节: " + BitConverter.ToString(data));
}
}
#endregion
#region 写入端口
/// <summary>
/// 写入端口
/// </summary>
/// <param name="PortName"></param>
public void WriteToPort(byte[] data)
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Write(data, 0, data.Length);
Debug.Log("串口已写入");
}
}
#endregion
#region 程序退出时调用
/// <summary>
/// 程序退出时调用
/// </summary>
private void OnApplicationQuit()
{
ClosePort();
}
#endregion
#region 串口属性初始化
/// <summary>
/// 串口属性初始化
/// </summary>
/// <param name="portName">端口号</param>
/// <param name="baudRate">波特率</param>
/// <param name="parity">校验位</param>
/// <param name="dataBits">数据位</param>
/// <param name="stopBits">停止位</param>
public void Initialize(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
PortName = portName;
BaudRate = baudRate;
Parity = parity;
DataBits = dataBits;
StopBits = stopBits;
if (serialPort == null)
{
serialPort = new SerialPort(PortName, BaudRate, (System.IO.Ports.Parity)Parity, DataBits, (System.IO.Ports.StopBits)StopBits)
{
ReadTimeout = 5000,
WriteTimeout = 1000
};
}
}
#endregion
}