使用過一些網上一些大神的代碼後,或多或少都有點小缺陷,關於數據讀取缺失或者一些不太滿意的問題,於是整合了一下。
一次性讀取完整串口數據。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System.Threading;
using System;
using System.Text;
public class PortControl : MonoBehaviour
{
[Header("串口名")] public string portName = "COM3";
[Header("波特率")] public int baudRate = 9600;
[Header("效驗位")] public Parity parity = Parity.None;
[Header("數據位")] public int dataBits = 8;
[Header("停止位")] public StopBits stopBits = StopBits.One;
private SerialPort sp = null;
private Thread dataReceiveThread;
private Global global;
private byte[] datasBytes;
int i = 0;
private string OneString;
private string OtherString;
private void Start()
{
global = Global.Instance;
OpenPortControl();
}
/// <summary>
/// 開啓串口
/// </summary>
public void OpenPortControl()
{
sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
//串口初始化
if (!sp.IsOpen)
{
sp.Open();
}
dataReceiveThread = new Thread(ReceiveData);//該線程用於接收串口數據
dataReceiveThread.Start();
}
/// <summary>
/// 關閉串口
/// </summary>
public void ClosePortControl()
{
if (sp != null && sp.IsOpen)
{
sp.Close();//關閉串口
sp.Dispose();//將串口從內存中釋放掉
}
}
private void ReceiveData()
{
int bytesToRead = 0;
while (true)
{
if (sp != null && sp.IsOpen)
{
try
{
datasBytes = new byte[1024];
bytesToRead = sp.Read(datasBytes, 0, datasBytes.Length);
if (bytesToRead == 0)
{
continue;
}
else
{
string strbytes = Encoding.Default.GetString(datasBytes);
i++;
if (i == 1)
{
OneString = strbytes[0].ToString();
}
else if (i == 2)
{
OtherString = OneString + strbytes;
i = 0;
Debug.Log(OtherString);
}
//Debug.Log(strbytes);
}
}
catch (Exception e)
{
Debug.Log(e.Message);
}
}
Thread.Sleep(100);
}
}
void OnApplicationQuit()
{
ClosePortControl();
}
}