using System.IO.Ports; namespace Ramitta.lib { public class SerialPortHandler : IDisposable { private SerialPort _serialPort; private bool _isConnected = false; // 串口连接状态事件 public event Action ConnectionStatusChanged; public event Action DataReceived; public event Action ErrorOccurred; public SerialPortHandler() { _serialPort = new SerialPort(); _serialPort.DataReceived += SerialPort_DataReceived; _serialPort.ErrorReceived += SerialPort_ErrorReceived; } /// /// 获取可用的串口列表 /// public string[] GetAvailablePorts() { return SerialPort.GetPortNames(); } /// /// 连接串口 /// 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; } } /// /// 断开串口连接 /// public void Disconnect() { try { if (_serialPort.IsOpen) { _serialPort.Close(); _isConnected = false; ConnectionStatusChanged?.Invoke(false); } } catch (Exception ex) { ErrorOccurred?.Invoke($"断开串口失败: {ex.Message}"); } } /// /// 发送数据 /// 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; } } /// /// 发送字节数据 /// 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; } } /// /// 读取数据 /// public string ReadData() { try { if (!_isConnected) { ErrorOccurred?.Invoke("串口未连接"); return string.Empty; } return _serialPort.ReadExisting(); } catch (Exception ex) { ErrorOccurred?.Invoke($"读取数据失败: {ex.Message}"); return string.Empty; } } /// /// 获取连接状态 /// public bool IsConnected => _isConnected; /// /// 获取串口信息 /// 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}"); } /// /// 释放资源 /// public void Dispose() { Disconnect(); _serialPort?.Dispose(); } } }