Как вызвать другую функцию в другом классе из SerialPort Eventhandler, обработать данные и обновить форму? - PullRequest
1 голос
/ 07 мая 2019

У меня есть два разных класса: один, на котором у меня есть форма (Form1), и другой, где у меня связь SerialPort (SerialPortCom). Я могу отправлять и получать данные из последовательного порта, но когда я отправляю данные в form1 и пытаюсь поместить их в текстовое поле, оно никогда не обновляется.

Как мне из SerialPortCom'а обработчик событий SerialPort вызвать функцию в Form1, где я могу обновить форму и обработать данные?

Мой код SerialPort очень вдохновлен учебником PsychoCoder по последовательному порту в C #: https://www.dreamincode.net/forums/topic/35775-serial-port-communication-in-c%23/#/ Он обновляет текстовое поле из класса SerialPort, но я хотел бы отправить строку в Form1, чтобы я мог обработать ее, прежде чем отобразить ее.

Я попытался вызвать TextBox.update, Invalidate, refresh. Я тоже пробовал

public void data(string message)
{
    messagereceived = message;

    if (modtag_textbox.InvokeRequired)
    {
        modtag_textbox.Invoke(new EventHandler(delegate { modtag_textbox.Text = message; }));
    }
    else
    {
        modtag_textbox.Text = message;              
    }
}

Но это никогда не входило в утверждение if. И если я помещу его в оператор if, он выдаст ошибку.

Код из обработчика событий SerialPortCom:

[STAThread]
void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string msg = SerialPort1.ReadExisting();

    Form1 test = new Form1();
    test.data(msg);
}

Нет проблем с входом в обработчик событий, а также он вызывает функцию data () в Form1.

Я хочу отправить сообщение из SerialPortCom в функцию в Form1, оттуда обработать данные и отобразить их в текстовом поле формы.

Спасибо за помощь, Клаус Хаммер

1 Ответ

0 голосов
/ 08 мая 2019

Вам необходимо установить форму в вашем классе для вашего последовательного порта, а затем создать функцию в вашем классе формы, которая обновляет интерфейс.Это можно сделать для события Form Load, см. Мой пример ниже:

//Your main form
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        mySerialClass msc = new mySerialClass(this);
        msc.startSerialLogic(); //start our serial logic
    }

    public updateGUI(string s)
    {
        textbox1.Text = s;
    }
}

//your class with your serial logic
class mySerialClass
{
    private Form1 f1;

    public mySerialClass(Form1 myForm)
    {
        f1 = myForm;
    }

    public void startSerialLogic()
    {
        //start your serial stuff here
    }

    private void updateFormGUI(string s)
    {
        f1.updateGUI(s);
    }

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        updateFormGUI(serialPort1.ReadExisting());
    }
}

Так что, когда вы захотите обновить свой интерфейс из своего класса с помощью последовательной логики, вы можете просто вызвать updateFormGUI, чтовызовите свою функцию из основной формы f1.updateGUI(s);.Очевидно, это не обязательно должна быть строка, это всего лишь пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...