k-ist-k
Goto Top

C Sharp - SerialPort.DataReceived Event statt Timer

Hallo Werte ITler,

heute wende ich mich mal an euch, wegen dem Thema Programmieren in C#.
Ich hab einen Arduino der mir über COM4 (57600 BaudRate) Zahlen ausgibt,
die er von einer Matrix bekommt.

Die Matrix hat mehrere Sensoren, je nachdem auf welchen man drauf drückt,
gibt der Arduino Zahlen zurück, pro Sensor nur eine Zahl.
Und diese Zahl möchte ich in C# in eine Variable speichern
und dann mit dem schon vorhanden Code verarbeiten.


Ich möchte die Zahl in C# in eine Variable übergeben,
damit ich damit arbeiten kann.
Bis jetzt lief es über einen Timer,
nur wenn gerade der Timer neubeginnt und da, der Arduino die Zahl übergibt,
passiert einfach nichts und man muss nochmal klicken.

SerialPort.DataReceived ist einfach deutlich schöner.
Ich hab jetzt schon mehrere Artikel gelesen und auf Youtube paar Videos gesehen.
Leider komme ich nicht ganz dahinter wie es funktioniert.
Viele machen es mit Button Klick, aber das bringt mir nichts.

Es gibt bei mir in c# mehrere Forms und in jeder brauche ich das.
Also wäre es sinnvoll eine Form anzulegen zB (SerialPort.cs)
und darin eine CLASS zu definieren ?

Was ich dann in den anderen Forms aufrufe ?

Ich versteh nur noch nicht ganz,
wo ich was wie definiere, damit die eine Form permanent auf eine Zahl vom Arduino wartet,
ohne einen Timer zu benutzen.


Code von einer Form
Leider passiert gar nichts, wenn ich auf die Matrix drücke.
Console.WriteLine habe ich auskommentiert.
GV.A ist eine Globe Variable.
Damit wolle ich testen, ob in die Variable ein Wert auftaucht.

using System;
using System.IO.Ports;
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.Threading;
using System.Threading.Tasks;

namespace WindowsFormsApplication3
{
    public partial class test : Form
    {
        private void button10_Click(object sender, EventArgs e) //Hauptmenü
        {
            serialPort1.Close();
            Menu Menu = new Menu();
            Menu.Tag = this;
            Menu.Show(this);
            Hide();
        }

        public test()
        {
            InitializeComponent();
            serialPort1.Open();
        }


        class PortDataReceived
        {
            public static void Matrix()
            {
                SerialPort mySerialPort = new SerialPort("COM4");  

                mySerialPort.BaudRate = 57600;
                mySerialPort.Parity = Parity.None;
                mySerialPort.StopBits = StopBits.One;
                mySerialPort.DataBits = 8;
                mySerialPort.Handshake = Handshake.None;
                mySerialPort.RtsEnable = true;

                mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

                mySerialPort.Open();

                //Console.WriteLine("Press any key to continue..."); 
                //Console.WriteLine();
                //Console.ReadKey();
                mySerialPort.Close();
            }

            private static void DataReceivedHandler(
                                object sender,
                                SerialDataReceivedEventArgs e)
            {
                SerialPort sp = (SerialPort)sender;
                string indata = sp.ReadExisting();
                //Console.WriteLine("Data Received:"); 
                //Console.Write(indata);

                GV.A = indata; //testen ob was passiert.
            }
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

        }
    }
}

Hab sicher vergessen, etwas zu erwähnen.
Also fragt einfach, wenn ihr was wissen wollt
oder wenn ich was wichtiges vergessen habe.

Content-Key: 389304

Url: https://administrator.de/contentid/389304

Printed on: April 16, 2024 at 22:04 o'clock

Member: K-ist-K
K-ist-K Oct 15, 2018 at 10:20:10 (UTC)
Goto Top
hat keiner eine Idee ?