Jak wyświetlić odebrane z SerialPort dane w formatce?

0

Witam,

mam następujący problem. Cały czas się uczę.
Program w WinForms z wykorzystaniem SerialPortu odbiera i wyświetla mi dane na labelce, która znajduje się na formatce.
Przy wyświetlaniu danych, działają mi oba rozwiązania - ShowData i ReceivedText

W drugim etapie chciałem wykorzystać instancję klasy, która zawiera SerialPort.
Dane w obrębie tego obiektu również przychodzą, ale nie wiem jak przerzucić je do Form1 i wyświetlić.

Wiem, wiem, SOLIDNE podstawy, cały czas się uczę, nie idę na łatwiznę, ale czasem dochodzę do takich momentów i nie mogę ruszyć dalej.

W zamieszczonym kodzie zamieściłem tylko jedną linijkę z konfiguracji SerialPortu, z dodaniem zdarzenia, żeby nie zaciemniać kodu.

Z góry dziękuję za pomoc.

using System;
using System.IO.Ports;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public SerialPort myserialport;
        public string datain;

        public Form1()
        {
            InitializeComponent();
        }      

        private void Form1_Load(object sender, EventArgs e)
        {
            //KOD DLA SERIALPORT W OBRĘBIE FORM1
            myserialport = new SerialPort();
            //TUTAJ TYLKO JEDNA LINIJA KODU Z KONFIGURACJI, ŻEBY NIE ZACIEMNIAĆ KODU
            myserialport.DataReceived += new SerialDataReceivedEventHandler(mydatareceive);

            //KOD DLA SERIALPORT W PRZY PRÓBIE ZBUDOWANIA KLASY RS232 Z ZAWARTYM W NIEJ SERIALPORTEM
            RS232 rS232 = new RS232();

        }


        public void mydatareceive(object sender, SerialDataReceivedEventArgs e)
        {
            datain = myserialport.ReadExisting();

            //PIERWSZA OPCJA - Z WYWOŁANIE ShowData
            this.Invoke(new EventHandler(ShowData));

            //DRUGA OPCJA
            ReceivedText(datain);
        }

        private void ShowData(object sender, EventArgs e)
        {
            label_Odebrane.Text = datain;
        }


        private void ReceivedText(string text)
        {
            MethodInvoker methodInvokerDelegate = delegate ()
            {
                label_Odebrane.Text = text;
            };

            if (this.InvokeRequired)
                this.Invoke(methodInvokerDelegate);
            else
                methodInvokerDelegate();
        }
    }

    public class RS232
    {
        public SerialPort myserialport;
        public string datain;

        public RS232() 
        {
            myserialport = new SerialPort();
            //TUTAJ TYLKO JEDNA LINIJA KODU Z KONFIGURACJI, ŻEBY NIE ZACIEMNIAĆ KODU
            myserialport.DataReceived += new SerialDataReceivedEventHandler(mydatareceive);
        }

        public void mydatareceive(object sender, SerialDataReceivedEventArgs e)
        {
            datain = myserialport.ReadExisting();

            //JAK PRZENIEŚĆ Z TEGO MIEJSCA ODCZYTANY WYNIK I WYŚWIETLIĆ W LABELCE WIDOCZNEJ NA FORM1
        }
    }
}
1

Zakładając, że chcesz przesyłać dane od razu to możesz np. zrobić własny event podobnie jak ma to zrobione SerialPort pod który podepniesz się w formatce i wyświetlisz przychodzące dane.

W RS232 dodaj

...
public event EventHandler<string> DataReceived;

public void mydatareceive(object sender, SerialDataReceivedEventArgs e)
{
    datain = myserialport.ReadExisting();

    DataReceived?.Invoke(this, datain);
}

A na formie podpinasz się pod ten event tak jak to zrobiłeś podpinając się pod DataReceived na SerialPort

RS232 rS232 = new RS232();
rS232.DataReceived += RS232_DataReceived;


private void RS232_DataReceived(object sender, string e)
{
    label_Odebrane.Text = e;
}

W miarę potrzeb możesz przesyłane dane zrobić bardziej bogate w informacje bo w tej chwili przesyłany jest tylko łańcuch znaków.

0
PawelLukasik napisał(a):

Zakładając, że chcesz przesyłać dane od razu to możesz np. zrobić własny event podobnie jak ma to zrobione SerialPort pod który podepniesz się w formatce i wyświetlisz przychodzące dane.

W RS232 dodaj

...
public event EventHandler<string> DataReceived;

public void mydatareceive(object sender, SerialDataReceivedEventArgs e)
{
    datain = myserialport.ReadExisting();

    DataReceived?.Invoke(this, datain);
}

A na formie podpinasz się pod ten event tak jak to zrobiłeś podpinając się pod DataReceived na SerialPort

RS232 rS232 = new RS232();
rS232.DataReceived += RS232_DataReceived;


private void RS232_DataReceived(object sender, string e)
{
    label_Odebrane.Text = e;
}

W miarę potrzeb możesz przesyłane dane zrobić bardziej bogate w informacje bo w tej chwili przesyłany jest tylko łańcuch znaków.

Bardzo, bardzo dziękuję za pomoc! Teraz już rozumiem. Zastanawiałem się nad czymś takim, ale nurtowało mnie czy nie ma innej metody.

Jeszcze raz dziękuję za pomoc a nie od razu krytykę.

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1