R Read Ответов: 0

У меня есть проблема с передачей данных из последовательного класса в основную форму


Я пытаюсь передать данные обратно из класса последовательного порта в основную форму. Я попытался использовать пример кода из других вопросов по этой теме(например, c# - доступ к элементам управления WinForms из последовательного порта в классе-переполнение стека[^] ) . Я постарался следовать примеру кода как можно ближе и сделал очень простой проект, чтобы заставить его работать, прежде чем расширять проект. Когда я компилирую, я получаю ошибки.
Последовательный класс - это файл. cs в том же проекте, что и основной файл Form .cs.

Main Form code:

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;

namespace SendReceiveData
{
    public partial class Form1 : Form
    {
        SerialClass myComms;

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            myComms = new SerialClass();
            myComms.DataReceived += new myComms.DataReceivedDelegate(myCommsDataReceived);    // ERROR 1 at compile          
            // Open COMM3 at 19200 baud
            myComms.OpenSerialPort(3, 19200);               
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            myComms.commsPortWriteMsg("Hello");
        }

        private delegate void DataReceivedDelegate(string data);

        void myCommsDataReceived(string data)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DataReceivedDelegate(myCommsDataReceived), new Object[] { data });
            }
            else
            {
                textBox1.Text = data;
            }
        }

    }
}

The Serial class

<pre>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;

namespace SendReceiveData
{
    class SerialClass
    {
        public delegate void DataReceivedDelegate(string data);
        public event DataReceivedDelegate DataReceived;

        static SerialPort commsPort;

        public SerialClass()
        {
            commsPort = new SerialPort();
            // Attach a method to be called when data waiting in the port's buffer
            commsPort.DataReceived += new SerialDataReceivedEventHandler(commsPortDataReceived);
        }

        public Boolean OpenSerialPort(byte comPort, int baudRate)
        {
            Boolean boolResult;
            try
            {
                // Initialise COM port
                commsPort.PortName = "COM" + comPort.ToString();
                commsPort.Parity = Parity.None;
                commsPort.DataBits = 8;
                commsPort.StopBits = StopBits.One;
                commsPort.ReadTimeout = 500;
                commsPort.WriteTimeout = 500;
                commsPort.BaudRate = baudRate;

                if (!commsPort.IsOpen)
                {
                    commsPort.Open();
                }
                boolResult = true;
            }
            catch (Exception ex)
            {
                boolResult = false;
                SerialPortClose();
            }
            return boolResult;
        }

        private static void commsPortDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // ... grab the data and place into a string called "data" ...
            string data = "";

            // raise our custom event:
            if (DataReceived != null)    <// ERROR 2 AT COMPILE
            {
                DataReceived(data);      // ERROR 3 AT COMPILE
            }
        }

        public Boolean commsPortWriteMsg(byte[] bOutbuffer)
        {
            Boolean boolResult = false;
            try
            {
                // Write data
                int msgLen = (int)(bOutbuffer[4]) * 256;
                msgLen += (int)bOutbuffer[5];

                commsPort.Write(bOutbuffer, 0, msgLen + 7);
            }
            catch (Exception ex)
            {
                boolResult = false;
            }
        }

        ....
        // Other functions 
    }
}


Что я уже пробовал:

Когда я компилирую код, я получаю ошибки. Я показал строки, где встречаются ошибки, как жирные и подчеркнутые :

Error1 Form1. cs 23 'SendReceiveData.Form1.myComms 'является " полем", но используется как "тип"

Error3 SerialClass. cs 61 ссылка на объект требуется для нестатического поля, метода или свойства 'SendReceiveData.SerialClass.DataReceived'

Error4 SerialClass. cs 63 ссылка на объект требуется для нестатического поля, метода или свойства 'SendReceiveData.SerialClass.DataReceived'

Помощь в решении этой проблемы будет оценена по достоинству!

RickZeeland

Одна ошибка, которую я вижу, находится в commsPortDataReceived (), вам нужно:
commsPort.DataReceived

RickZeeland

myComms.DataReceived += новый myComms.DataReceivedDelegate(myCommsDataReceived);

Может быть записано как:
myComms. DataReceived += myCommsDataReceived;

Не забудьте удалить его, когда он больше не нужен, как это:
myComms. DataReceived - = myCommsDataReceived;

Это делается для предотвращения утечек памяти.

Marco Bertschi

Взгляните на https://www.codeproject.com/Articles/678025/Serial-Comms-in-Csharp-for-Beginners для дальнейшего ознакомления.

0 Ответов