SerialPort c#自定义委托从DataReceived

本文关键字:DataReceived 自定义 SerialPort | 更新日期: 2023-09-27 18:14:37

我正在做一个与串行端口一起工作的类。直到项目通过串行端口接收数据,类在主应用程序中引发事件。

我的问题是:如何将参数传递给委托并在我的类中使用它,因为我的类是如此独立。

下面的来源和我喜欢在哪里花代表。

类控制串口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace TCCExterna.Lib
{
    public class PortaSerial  //: IDisposable
    {   
        private SerialPort serialPort;
        private Queue<byte> recievedData = new Queue<byte>();
        public PortaSerial()
        {
            serialPort = new SerialPort();            
            serialPort.DataReceived += serialPort_DataReceived;            
        }
        public void Abrir(string porta, int velocidade)
        {
            serialPort.PortName = porta;
            serialPort.BaudRate = velocidade;
            serialPort.Open();
        }
        public string[] GetPortas()
        {
            return SerialPort.GetPortNames();
        }
        public string[] GetVelocidades()
        {
            return new string[] { "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" };
        }
        void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
        {
            byte[] data = new byte[serialPort.BytesToRead];
            serialPort.Read(data, 0, data.Length);
            data.ToList().ForEach(b => recievedData.Enqueue(b));
            processData();            
            // like this use LineReceivedEvent or LineReceived
        }
        private void processData()
        {
            // Determine if we have a "packet" in the queue
            if (recievedData.Count > 50)
            {
                var packet = Enumerable.Range(0, 50).Select(i => recievedData.Dequeue());                
            }
        }
        public void Dispose()
        {
            if (serialPort != null)
                serialPort.Dispose();
        }
    }
}

计划:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using TCCExterna.Lib;
namespace TCCExterna
{
    public partial class FormPrincipal : Form
    {
        PortaSerial sp1 = new PortaSerial(); // like this command passed LineReceivedEvent or LineReceived
        public delegate void LineReceivedEvent(string line);
        public void LineReceived(string line)
        {
            //What to do with the received line here            
        }
        public FormPrincipal()
        {
            InitializeComponent();
            cmbPortas.Items.AddRange(sp1.GetPortas());
            cmbVelocidade.Items.AddRange(sp1.GetVelocidades());
        }
   }
}

SerialPort c#自定义委托从DataReceived

如果我明白了,你想要的是这个:(se quiiser pode explar melhor em português, depois a gente traduz pro site)。

 //delcare an event args clas
 public class LineReceivedEventArgs : EventArgs
{
    //Data to pass to the event
    public string LineData{get; private set;}
    public LineReceivedEventArgs(string lineData)
    {
        this.LineData = lineData
    }
}
//declare a delegate
public delegate void LineReceivedEventHandler(object sender, LineReceivedEventArgs Args);
public class PortaSerial  //: IDisposable
{
    private SerialPort serialPort;
    private Queue<byte> recievedData = new Queue<byte>();
    //add event to class
    public event LineReceivedEventHandler LineReceived;
    public PortaSerial()
    {
        serialPort = new SerialPort();
        serialPort.DataReceived += serialPort_DataReceived;
    }
    public void Abrir(string porta, int velocidade)
    {
        serialPort.PortName = porta;
        serialPort.BaudRate = velocidade;
        serialPort.Open();
    }
    public string[] GetPortas()
    {
        return SerialPort.GetPortNames();
    }
    public string[] GetVelocidades()
    {
        return new string[] { "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" };
    }
    void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
    {
        byte[] data = new byte[serialPort.BytesToRead];
        serialPort.Read(data, 0, data.Length);
        data.ToList().ForEach(b => recievedData.Enqueue(b));
        processData();
        //raise event here
        if (this.LineReceived != null)
            LineReceived(this, new LineReceivedEventArgs("some line data"));

    }
    private void processData()
    {
        // Determine if we have a "packet" in the queue
        if (recievedData.Count > 50)
        {
            var packet = Enumerable.Range(0, 50).Select(i => recievedData.Dequeue());
        }
    }
    public void Dispose()
    {
        if (serialPort != null)
            serialPort.Dispose();
    }
}

public partial class FormPrincipal : Form
{
    PortaSerial sp1 = new PortaSerial(); // like this command passed LineReceivedEvent or LineReceived
    // event handler method
    void sp1_LineReceived(object sender, LineReceivedEventArgs Args)
    {
        //do things with line
        MessageBox.ShowDialog(Args.LineData);
    }
    public FormPrincipal()
    {
        InitializeComponent();
        //add handler to event
        sp1.LineReceived += new LineReceivedEventHandler(sp1_LineReceived);
        cmbPortas.Items.AddRange(sp1.GetPortas());
        cmbVelocidade.Items.AddRange(sp1.GetVelocidades());
    }

}