⭐ Unity 串口通信外置配置表

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System;
using System.Text;
using System.IO; // 新增的命名空间

public class SerialPortControl : MonoBehaviour
{
    public string getPortName;
    public int baudRate;
    public string dataType;  // 数据类型(Hex 或 String)
    public string startPlayCommand;  // 开始播放命令
    public string stopPlayCommand;   // 停止播放命令
    public string startPlayCommandHex;  // 开始播放命令
    public string stopPlayCommandHex;   // 停止播放命令
    private Parity parity = Parity.None;
    private int dataBits = 8;
    private StopBits stopBits = StopBits.One;
    SerialPort sp = null;
    private string _data;

    void Start()
    {
        LoadConfig(); // 读取配置
        OpenPort(getPortName);
        StartCoroutine(DataReceiveFunction());
    }

    // 读取配置文件
    private void LoadConfig()
    {
        string filePath = Path.Combine(Application.streamingAssetsPath, "config.txt"); // 文件路径
        if (File.Exists(filePath))
        {
            string[] lines = File.ReadAllLines(filePath);
            foreach (var line in lines)
            {
                if (line.StartsWith("COMPort:"))
                {
                    getPortName = line.Substring("COMPort:".Length).Trim(); // 提取 COM 号
                }
                else if (line.StartsWith("BaudRate:"))
                {
                    string baudRateStr = line.Substring("BaudRate:".Length).Trim();
                    int.TryParse(baudRateStr, out baudRate); // 提取波特率
                }
                else if (line.StartsWith("DataType:"))
                {
                    dataType = line.Substring("DataType:".Length).Trim(); // 提取数据类型
                }
                else if (line.StartsWith("StartPlayCommand:"))
                {
                    startPlayCommand = line.Substring("StartPlayCommand:".Length).Trim(); // 提取开始播放命令
                }
                else if (line.StartsWith("StopPlayCommand:"))
                {
                    stopPlayCommand = line.Substring("StopPlayCommand:".Length).Trim(); // 提取停止播放命令
                }
                else if (line.StartsWith("KaiShibofangHex:"))
                {
                    startPlayCommandHex = line.Substring("KaiShibofangHex:".Length).Trim(); // 提取开始播放命令
                }
                else if (line.StartsWith("TingzhibofangHex:"))
                {
                    stopPlayCommandHex = line.Substring("TingzhibofangHex:".Length).Trim(); // 提取停止播放命令
                }
            }
            Debug.Log($"读取配置 - COM端口: {getPortName}, 波特率: {baudRate}, 数据类型: {dataType}, 开始播放命令: {startPlayCommand}, 停止播放命令: {stopPlayCommand}");
        }
        else
        {
            Debug.LogError("配置文件未找到: " + filePath);
        }
    }

    private void PortSignalControl(string _str)
    {
        if (dataType == "Hex")
        {
            Debug.Log("收到16进制数据: " + _str);

            // 根据接收到的命令判断是否开始播放或停止播放
            if (_str == startPlayCommandHex)
            {
                StartPlay();
            }
            else if (_str == stopPlayCommandHex)
            {
                StopPlay();
            }
        }
        else if (dataType == "String")
        {
            Debug.Log("收到字符串数据: " + _str);

            // 根据接收到的命令判断是否开始播放或停止播放
            if (_str == startPlayCommand)
            {
                StartPlay();
            }
            else if (_str == stopPlayCommand)
            {
                StopPlay();
            }
        }

        

        
    }

    private void StartPlay()
    {
        // 实现开始播放的逻辑
        Debug.Log("开始播放");
        // 这里可以加入实际播放的代码逻辑,例如启动一个动画或音频播放等。
    }

    private void StopPlay()
    {
        // 实现停止播放的逻辑
        Debug.Log("停止播放");
        // 这里可以加入实际停止的代码逻辑,例如停止一个动画或音频等。
    }

    public void OpenPort(string DefaultPortName)
    {
        sp = new SerialPort(DefaultPortName, baudRate, parity, dataBits, stopBits);
        sp.ReadTimeout = 10;
        try
        {
            if (!sp.IsOpen)
            {
                sp.Open();
                Debug.Log($"已成功开启{getPortName}端口...波特率{baudRate}");
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }

    public void ClosePort()
    {
        try
        {
            sp.Close();
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }

    IEnumerator DataReceiveFunction()
    {
        byte[] dataBytes = new byte[256];
        int bytesToRead = 0;

        while (true)
        {
            if (sp != null && sp.IsOpen)
            {
                try
                {
                    bytesToRead = sp.Read(dataBytes, 0, dataBytes.Length);
                    if (dataType == "Hex")
                    {
                        // 如果是16进制数据,转化为16进制字符串
                        _data = BitConverter.ToString(dataBytes, 0, bytesToRead).Replace("-", " ");
                    }
                    else if (dataType == "String")
                    {
                        // 如果是字符串数据,将字节转换为字符串
                        _data = Encoding.UTF8.GetString(dataBytes, 0, bytesToRead);
                    }
                    PortSignalControl(_data);
                }
                catch (Exception ex)
                {
                    // 处理读取错误
                }
            }
            yield return new WaitForSeconds(Time.deltaTime);
        }
    }

    public void SendSerialPortData(string data)
    {
        if (sp.IsOpen)
        {
            Byte[] bytes = StrToToHexByte(data);
            sp.Write(bytes, 0, bytes.Length);
        }
    }

    private static byte[] StrToToHexByte(string hexString)
    {
        hexString = hexString.Replace(" ", "");
        if ((hexString.Length % 2) != 0)
            hexString += " ";
        byte[] returnBytes = new byte[hexString.Length / 2];
        for (int i = 0; i < returnBytes.Length; i++)
            returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
        return returnBytes;
    }

    public void SendString(string _dataStr)
    {
        SendSerialPortData(_dataStr);
    }

    private void OnApplicationQuit()
    {
        ClosePort();
    }

    private void OnDisable()
    {
        ClosePort();
    }
}

配置表 txt

【串口号 波特率】
COMPort:COM3
BaudRate:9600

【接收数据类型 Hex // 或者 "String"】
DataType:String

【以下命令二选一即可】
【开始播放 停止播放 string类型】
StartPlayCommand: p
StopPlayCommand: s
【开始播放 停止播放 Hex类型】
KaiShibofangHex:00
TingzhibofangHex:01

感谢大家的观看,您的点赞和关注是我最大的动力

不定时更新知识点和干货呦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值