0

Action<T> Delegateクラスとフォームの間のリンクを作成するために使用しています。クラスがシリアルポートに接続され、受信したデータがフォームに表示されます。受信したデータを表示するメソッドを FormにAction<T> Delegateカプセル化します。ただし、デリゲートは常に null を表示しており、メソッドをカプセル化していません。

クラスコードは次のとおりです。

 public SerialPort mySerialPort;

    public Action<byte[]> DataReceived_Del;             //delegate for data recieved

    public string connect()
    {
        try
        {

            mySerialPort = new SerialPort("COM14");
            mySerialPort.BaudRate = 115200;
            mySerialPort.DataBits = 8;
            mySerialPort.Parity = System.IO.Ports.Parity.None;
            mySerialPort.StopBits = System.IO.Ports.StopBits.One;
            mySerialPort.RtsEnable = false;

            mySerialPort.DataReceived += mySerialPort_DataReceived;
            mySerialPort.Open();

        }
        catch (SystemException ex)
        {
            MessageBox.Show(ex.Message);
        }
        if (mySerialPort.IsOpen)
        {
            return "Connected";
        }
        else
        {
            return "Disconnected";
        }
    }


    //serial port data recieved handler
    public void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            //no. of data at the port
            int ByteToRead = mySerialPort.BytesToRead;

            //create array to store buffer data
            byte[] inputData = new byte[ByteToRead];

            //read the data and store
            mySerialPort.Read(inputData, 0, ByteToRead);


            var copy = DataReceived_Del;
            if (copy != null) copy(inputData); 

        }
        catch (SystemException ex)
        {
            MessageBox.Show(ex.Message, "Data Received Event");
        }
    }

次の形式でデータを表示します。

 public Form1()
    {
        InitializeComponent();
        Processes newprocess = new Processes();
        newprocess.DataReceived_Del += Display;


    }

    //Display
    public void Display(byte[] inputData)
    {
        try
        {
            Invoke(new Action(() => TboxDisp.AppendText((BitConverter.ToString(inputData)))));
        }
        catch (SystemException ex)
        {
            MessageBox.Show(ex.Message, "Display section");
        }
    }

DataReceived_Delメソッドをカプセル化するはずですDisplayが、そうですNULL

何が起こっているのかわかりません..

どんな助けでも大歓迎です..

4

2 に答える 2

1

コンストラクタの外で newprocess を定義する必要があります。

Processes newprocess;
public Form1()
{
    InitializeComponent();
    newprocess = new Processes();
    newprocess.DataReceived_Del += Display;


}
于 2013-03-19T08:11:18.843 に答える
0

+= を使用してデリゲートに追加していますが、デリゲートは最初は NULL です。それがうまくいくかどうかはわかりません。+= の代わりに = を試してみます。

public Form1() {
    InitializeComponent();
    Processes newprocess = new Processes();
    newprocess.DataReceived_Del = Display;
}
于 2013-03-19T08:32:17.523 に答える