Files
Ramitta-lib/Ramitta/SerialPortHandler.cs

198 lines
5.4 KiB
C#

using System.IO.Ports;
namespace Ramitta.lib
{
public class SerialPortHandler : IDisposable
{
private SerialPort _serialPort;
private bool _isConnected = false;
// 串口连接状态事件
public event Action<bool> ConnectionStatusChanged;
public event Action<string> DataReceived;
public event Action<string> ErrorOccurred;
public SerialPortHandler()
{
_serialPort = new SerialPort();
_serialPort.DataReceived += SerialPort_DataReceived;
_serialPort.ErrorReceived += SerialPort_ErrorReceived;
}
/// <summary>
/// 获取可用的串口列表
/// </summary>
public string[] GetAvailablePorts()
{
return SerialPort.GetPortNames();
}
/// <summary>
/// 连接串口
/// </summary>
public bool Connect(string portName, int baudRate = 9600, Parity parity = Parity.None,
int dataBits = 8, StopBits stopBits = StopBits.One)
{
try
{
if (_isConnected)
Disconnect();
_serialPort.PortName = portName;
_serialPort.BaudRate = baudRate;
_serialPort.Parity = parity;
_serialPort.DataBits = dataBits;
_serialPort.StopBits = stopBits;
_serialPort.Handshake = Handshake.None;
_serialPort.ReadTimeout = 1000;
_serialPort.WriteTimeout = 1000;
_serialPort.Open();
_isConnected = true;
ConnectionStatusChanged?.Invoke(true);
return true;
}
catch (Exception ex)
{
ErrorOccurred?.Invoke($"连接串口失败: {ex.Message}");
return false;
}
}
/// <summary>
/// 断开串口连接
/// </summary>
public void Disconnect()
{
try
{
if (_serialPort.IsOpen)
{
_serialPort.Close();
_isConnected = false;
ConnectionStatusChanged?.Invoke(false);
}
}
catch (Exception ex)
{
ErrorOccurred?.Invoke($"断开串口失败: {ex.Message}");
}
}
/// <summary>
/// 发送数据
/// </summary>
public bool SendData(string data)
{
try
{
if (!_isConnected)
{
ErrorOccurred?.Invoke("串口未连接");
return false;
}
_serialPort.WriteLine(data);
return true;
}
catch (Exception ex)
{
ErrorOccurred?.Invoke($"发送数据失败: {ex.Message}");
return false;
}
}
/// <summary>
/// 发送字节数据
/// </summary>
public bool SendBytes(byte[] data)
{
try
{
if (!_isConnected)
{
ErrorOccurred?.Invoke("串口未连接");
return false;
}
_serialPort.Write(data, 0, data.Length);
return true;
}
catch (Exception ex)
{
ErrorOccurred?.Invoke($"发送字节数据失败: {ex.Message}");
return false;
}
}
/// <summary>
/// 读取数据
/// </summary>
public string ReadData()
{
try
{
if (!_isConnected)
{
ErrorOccurred?.Invoke("串口未连接");
return string.Empty;
}
return _serialPort.ReadExisting();
}
catch (Exception ex)
{
ErrorOccurred?.Invoke($"读取数据失败: {ex.Message}");
return string.Empty;
}
}
/// <summary>
/// 获取连接状态
/// </summary>
public bool IsConnected => _isConnected;
/// <summary>
/// 获取串口信息
/// </summary>
public string GetPortInfo()
{
if (!_isConnected)
return "串口未连接";
return $"{_serialPort.PortName} - {_serialPort.BaudRate}bps, {_serialPort.DataBits}数据位, {_serialPort.StopBits}停止位";
}
// 数据接收事件处理
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
string data = _serialPort.ReadExisting();
DataReceived?.Invoke(data);
}
catch (Exception ex)
{
ErrorOccurred?.Invoke($"数据接收错误: {ex.Message}");
}
}
// 错误接收事件处理
private void SerialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
ErrorOccurred?.Invoke($"串口错误: {e.EventType}");
}
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
Disconnect();
_serialPort?.Dispose();
}
}
}