串口通用帮助类 SerialPortHelper
Demo
private readonly SerialPortHelper _spHelper;
ctor() // 对象中初始化
{
    _spHelper = new SerialPortHelper();
    _spHelper.DataReceivedEvent += SerialPort_DataReceivedEvent;
    _spHelper.Close();
    if (_spHelper.Init("COM2"))
    {
        _spHelper.SetStartIdentifier(new byte[] { 0xFA, 0xFA });
        _spHelper.SetEndIdentifier(new byte[] { 0xFB, 0xFB });
    }
}
private void SerialPort_DataReceivedEvent(object sender, EventArgs e)
{       
    if (e is CustomSerialPortEventArgs arg)
    {
        var data = arg.Message;
        // TODO
    }
}
SerialPortHelper
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO.Ports;
/// <summary>
/// 串行端口通信帮助类(有帧头、帧尾检测)
/// </summary>
public class SerialPortHelper
{
    private readonly WeakEvent<EventArgs> _dataReceivedEvent = new WeakEvent<EventArgs>();
    /// <summary>
    /// 返回的消息数据弱事件
    /// </summary>
    public event EventHandler<EventArgs> DataReceivedEvent
    {
        add => _dataReceivedEvent.Add(value, value.Invoke);
        remove => _dataReceivedEvent.Remove(value);
    }
    public bool IsOpen => _serialPort != null && _serialPort.IsOpen;
    private CustomSerialPort _serialPort;
    /// <summary>
    /// 设置结尾标识符
    /// </summary>
    /// <param name="end"></param>
    public void SetEndIdentifier(byte[] end)
    {
        if (_serialPort != null)
        {
            _serialPort.EndIdentifier = end;
        }
    }
    /// <summary>
    /// 设置开始标识符
    /// </summary>
    /// <param name="start"></param>
    public void SetStartIdentifier(byte[] start)
    {
        if (_serialPort != null)
        {
            _serialPort.StartIdentifier = start;
        }
    }
    /// <summary>
    /// 延迟接收数据。
    /// 默认不设置帧头、帧尾,根据实际情况判断数据完整性!
    /// </summary>
    /// <param name="millisecond">默认500(ms)</param>
    public void SetDelayDataReceived(int millisecond = 500)
    {
        if (_serialPort == null)
        {
            return;
        }
        _serialPort.StartIdentifier = null;
        _serialPort.EndIdentifier = null;
        _serialPort.DelayReceived(millisecond);
    }
    public bool Init(string portName, int baudRate = 9600, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
    {
        try
        {
            _serialPort = new CustomSerialPort(portName, baudRate, parity, dataBits, stopBits);
            _serialPort.DataReceivedEvent += SerialPort_DataReceivedEvent;
            return _serialPort.IsOpen;
        }
        catch (Exception ex)
        {
            LogHelper.Info(ex.Message);
        }
        return false;
    }
    /// <summary>
    /// 串口数据写
    /// </summary>
    /// <param name="data"></param>
    public void Write(byte[] data)
    {
        if (IsOpen)
        {
            _serialPort.WritePort(data);
        }
    }
    /// <summary>
    /// 串口数据写
    /// </summary>
    /// <param name="data"></param>
    public void Write(string data)
    {
        if (IsOpen)
        {
            _serialPort.WritePort(data);
        }
    }
    public void Close()
    {
        if (_serialPort == null)
        {
            return;
        }
        _serialPort.DataReceivedEvent -= SerialPort_DataReceivedEvent;
        _serialPort.Close();
        _serialPort = null;
    }
    private void SerialPort_DataReceivedEvent(object sender, EventArgs e)
    {
        _dataReceivedEvent.Invoke(this, e);
    }
}
其中,CustomSerialPort是一般串口通信的基本功能,可自行实现。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号