来自DataReceived的SerialPort C#自定义委托

时间:2013-05-21 00:49:54

标签: c# winforms delegates serial-port

我正在做一个使用串口的课程。 它一直都很安静,直到通过串口接收数据的项目,该类在主应用程序中引发一个事件。

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

在消息来源之下以及我喜欢花费代表的地方。

类控制串口:

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());
        }
   }
}

1 个答案:

答案 0 :(得分:2)

如果我清楚地知道了,你想要的是:( se quiser pode explicar melhoremportuguês,depois 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());
    }


}