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
感谢大家的观看,您的点赞和关注是我最大的动力
不定时更新知识点和干货呦~