198 lines
5.4 KiB
C#
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();
|
|
}
|
|
}
|
|
} |