Laden...

Wie kann ich Daten per UDP Verbindung vom Microcontroller an meine Windows Form senden?

Erstellt von granca vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.142 Views
G
granca Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren
Wie kann ich Daten per UDP Verbindung vom Microcontroller an meine Windows Form senden?

Hallo zusammen, Mein erster Thread hier. Bei einer Verbindung zwischen einen Mikrokontroler und einer Windows Form klapt das empfangen
der Daten überhaupt nicht, das Senden an den Mikrokontroler funktioniert und die Daten kommen auch raus,
das kann ich mit einen UDP Terminal überprüfen.
Ich denke es liegt irgendwie an der Verbindung mit den Sockets oder so habe schon gegoogelt und herumprobiert komm aber nicht darauf.
Ich bin schon seit Wochen dran (nicht am stück).
Kann mir bitte jemand kurz drüberschauen?

Vielen herzlichen dank.

Peter

 
namespace Web_Komunikation2
{
    public partial class Form1 : Form
       {
        UdpClient ClientSocket = new UdpClient("192.168.0.60",10001);
        UdpClient receivingUdpClient = new UdpClient(10001);
        IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
        public int PortNumber = 10001;
        string txt1 = "Keine Verbindung";
        IPEndPoint ipepC;
        Socket udpclnt;  // New socket
        byte[] byteSend;
        byte[] data = new byte[1024];
        string input, stringData;//neu


        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, EventArgs e)
        { 
            label1.Text = txt1;
            label1.ForeColor = Color.Red;
            CheckForIllegalCrossThreadCalls = false;
        }
           

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                IPAddress serverAddr = IPAddress.Parse("192.168.0.60");
                ipepC = new IPEndPoint(serverAddr, 10001);
                udpclnt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                label1.Text = "Ethernet ein";
                label1.ForeColor = Color.Blue;
            }
            catch(Exception err)
            {

            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                btnFanOFF.Visible = true;
                btnFanON.Visible = false;
                byteSend = new byte[5];
                byteSend[0] = 115;
                udpclnt.SendTo(byteSend, ipepC);
                label1.ForeColor = Color.Green;
                udpclnt.Close();
                label1.Text = "Ethernet aus";
            }
            catch(Exception err)
            {
                label1.Text = "FEHLER!";
                label1.ForeColor = Color.Red;
            }
        }
        public void btnFanOFF_Click(object sender, EventArgs e)
        {
            try
            {
                btnFanOFF.Visible = false;
                btnFanON.Visible = true;
                byteSend = new byte[5];
                byteSend[0] = 97;
                udpclnt.SendTo(byteSend, ipepC);
                label1.Text = "VENTILATOR EIN";
                label1.ForeColor = Color.Red;
                data = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                stringData = Encoding.ASCII.GetString(data, 0, data.Length);
                lblTemp.Text = stringData;

            }
            catch(Exception ex)
            {
                label1.Text = "Fehlt Verbindung!";
                label1.ForeColor = Color.Red;
                btnFanOFF.Visible = true;
                btnFanON.Visible = false;
                MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK,   MessageBoxIcon.Error);
            }

        }

T
2.219 Beiträge seit 2008
vor 3 Jahren

Der Code sieht teilweise furchtbar aus.
Du hälst in der Klasse Variablen, die eigentlich nur innerhalb der jeweiligen Methode nötig und sinnvoll sind.
Auch ist nicht klar, warum du 5 bytes hinschickst, aber immer nur das erste setzt.
Ist den sichergestellt, dass diese korrekt sind?
Wenn du da irgend einen Datenmüll hinschickst, kann da auch nicht mehr viel passieren.

Meine Empfehlung wäre es auch, den Code aus der UI zu nehmen und sauber zu kapseln.
Die ganze Logik zum senden/empfangen etc. kannst du in einer Klasse kapseln.
Dann musst du diese nur einmal in deinem Code Instanzieren und über die jeweiligen Methoden die entsprechenden bytes senden/empfangen.

Schau dir dazu am besten den Artikel mal an:
[Artikel] Drei-Schichten-Architektur

Auch solltest du mal prüfen ob in button1_Click, dein Socket überhaupt funktioniert.
Du fängst dort die Exception, machst aber nichts damit.
Du weißt also nicht mal ob der Socket auf deiner Seite verwendet werden kann.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.807 Beiträge seit 2008
vor 3 Jahren

Typischer Fall, dass Du mal ordentlich kontrollierst, ob die Daten wirklich so über die Leitung gehen, wie sie sollen - vor allem mit externer Verbindung.

Was mir total fischig ins Auge springt ist das hier

  UdpClient ClientSocket = new UdpClient("192.168.0.60",10001);
        UdpClient receivingUdpClient = new UdpClient(10001);
        IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

Warum zwei Clients, die dann auch noch auf den gleichen Port hören?
Warum Remote Endpoint mit Port 0?
Und dann nochmal weitere Definitionen weiter unten?

Ich mag das jetzt nicht ganz so böse ausdrücken; aber ja, Dein Code ist furchtbar unleserlich. Ich kann mir irgendwie nur schwer vorstellen, dass Du noch selbst weißt, was Dein Code macht.
Nimm mal den einfachen Code aus den Samples, fang von Vorn mit einem Vergleichsprojekt an ([Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden) und geh strukturiert an die Sache.

G
granca Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren

Ok, danke vorerst, ja ich weiß mein Code ist nicht der Beste aber ich wollte das schnell mal testen, geht aber nicht so naja gut.
In Vb.net über RS232 und RS485 habe ich das laufen.
Ich wollte mal probieren über ein Ethernet Kabel den PIC18F45K22 mit einer C# Windows Form zu verbinden.
Mit einen heruntergeladen beispiel einer C# Console funktioniert es, wenn ich zb. ein "a" sende bekomme ich "Start" zurück,
sende ich ein "c" bekomme ich den Wert des Temperatursensors zurück.
Mit dem Consolen Beispiel funktioniert es.
Mit der Win Form nicht, werde das anders strukturieren und weiter probieren.

Danke.