Unity串口通信教程

这是我本人一直在使用的串口脚本,是我封装的好的,可以在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

}

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值