Files
shgxtzcjhoudaosaomadayinwpf/linesider_screen_tool/Hepler/SerialPortHepler.cs
2025-04-22 15:26:25 +08:00

88 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Text.RegularExpressions;
using MQTTnet;
using Newtonsoft.Json;
namespace linesider_screen_tool
{
public class SerialPortHepler:IDisposable
{
private SerialPort _serialPort;
// 内部缓冲区用于存储接收到的数据
private StringBuilder receiveBuffer = new StringBuilder();
public event Action<string> DataReceived;
public SerialPortHepler(string portName,int baudRaate,int parity,int dataBits,int stopBits)
{
_serialPort = new SerialPort(portName, baudRaate, (Parity)parity, dataBits, (StopBits)stopBits);
}
public async void Open()
{
if (_serialPort != null && _serialPort.IsOpen)
{
return;
}
try
{
_serialPort.Open();
_serialPort.DataReceived += SerialPort_DataReceived;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Close()
{
if (_serialPort == null || !_serialPort.IsOpen)
{
return;
}
try
{
_serialPort.DataReceived -= SerialPort_DataReceived;
_serialPort.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string newData = _serialPort.ReadExisting();
receiveBuffer.Append(newData);
// 处理缓冲区中的数据
string bufferContent = receiveBuffer.ToString();
string[] lines = Regex.Split(bufferContent, @"\r\n|\n|\r", RegexOptions.None);
for (int i = 0; i < lines.Length - 1; i++)
{
string line = lines[i].Trim();
if (!string.IsNullOrEmpty(line))
DataReceived.Invoke(line); ;
}
// 将最后一行保留到缓冲区中
receiveBuffer.Clear();
if (lines.Length > 0)
{
receiveBuffer.Append(lines[lines.Length - 1]);
}
}
public void Dispose()
{
Close();
_serialPort?.Dispose();
_serialPort = null;
}
}
}