Laden...

Wie Daten an COM-Schnittstelle schicken und je nach Antwort eine Aktion ausführen?

Erstellt von tomtimo vor 3 Jahren Letzter Beitrag vor 3 Jahren 352 Views
T
tomtimo Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren
Wie Daten an COM-Schnittstelle schicken und je nach Antwort eine Aktion ausführen?

Hallo,
ich bin hier im Forum also auch im Bereich der Programmierung ein Neuling. Ich beiße mir nun seit Tagen die Zähne an einem Vorhaben aus. Viele Probleme habe ich nun schon gelöst, aber so recht komme ich nicht zum Ziel. Daher brauche ich mal einen Denkanstoß von euch.
ich könnte jetzt meinen Code hier zeigen, aber dann lacht ihr mich aus. Außerdem laufe ich dann Gefahr, dass ihr den Code für ich fertig macht, und ich dann gar nichts dabei gelernt habe.

Mein einfaches Ziel ist es, einen Arduino zu steuern.
An dem Arduino ist eine LED angeschlossen. Die kann entweder an oder aus sein, wenn ich das Programm um welches es hier geht starte.

Den Ablauf stelle ich mir wie folgt vor:

Programmstart
Abfrage an Arduino nach dem Satus der LED
Je nach Status soll eine Checkbox entweder angehakt (LED = an) sein oder nicht (LED = aus)

Das Sket für den Arduino habe ich fertig. Bekommt er die Zeichenfolge "112" übermittelt, schickt er entweder 1111 (LED an Pin 11 = an) oder 1100 (LED an Pin 11 = aus) zurück
Schicke ich die Zeichenfolge "111" an den Arduino, schaltet er Pin 11 an, bei 110 schaltet er Pin 11 aus.

In dem Programm will ich die LED per erwähnter Checkbox ein oder ausschalten können.

Die Kommunikation über den Seriellen Port habe ich fertig.

Nun zu meinen Fragen:
Wie ich es hinbekomme, dass sofort beim Programmstart eine 112 an den Arduino geschickt wird, damit der Status der LED abgefragt wird und die Checkbox entsprechend versorgt wird. Wo muss der Code hin? Wie bekomme ich heraus, in welchem Datenformat die Antwort kommt? Int, String...
Ich muss danach mit einer IF-Anweisung weiter machen. Dazu muss es doch bol werden, oder nicht?

Wenn da gelöst ist, muss ich wahrscheinlich noch einmal fragen, wie ich dann die IF-Anweisung genau machen muss. Aber das will ich dann erst einmal selber versuchen.

Danke!

P
441 Beiträge seit 2014
vor 3 Jahren

Hi,

was für einen Projekttyp hast du denn?
Eine Konsolenanwendung oder etwas mit GUI?

Die Konsolenanwendung ist in erster Linie ja Prozedural, hier müsstest du das einfach in der Anwendung machen.

Was hast du denn bisher erfolglos gemacht?
Bekommst du eine Serielle Verbindung bereits aufgebaut?

T
tomtimo Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren

Hi, und Danke. Ich habe gerade alles mal gelöscht und neu angefangen.
Die Daten aus der Schnittstelle kommen irgendiwe an. So sieht es aktuell aus.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace RadioManagerII
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            String stat = "112";
            String off = "110";
            String on = "111";
            // Schickt eine Statusabfrage (112) an den Arduino um den Zustand der Lampe zu erfassen
            SerialPort mySerialPort = new SerialPort("COM1");
            mySerialPort.BaudRate = 9600;
            mySerialPort.Open();
            mySerialPort.Write(stat);
            System.Threading.Thread.Sleep(100);
            String StatusLampe = mySerialPort.ReadExisting();
            mySerialPort.Close();
            bool b = StatusLampe.Equals(1111) ? true : false;
            if ((b) == false) 
            {
                label1.Text="Lampe ist an";
            }
            else 
            {
                label1.Text = "Lampe ist aus";
            }
        }
    }
}

P
441 Beiträge seit 2014
vor 3 Jahren

Du wirst einige Probleme bekommen, wenn du das direkt so machst:* [FAQ] Warum blockiert mein GUI?

  • Du baust bei jeder Änderung der Checkbox eine Verbindung mit dem Serial Port auf und ggf. nicht wieder richtig ab

Es funktioniert nicht, weil du vom Serial Port einen String liest und diesen mit einem integer vergleichst.

Erstelle dir einen Service (= eine eigene Klasse), der die Kommunikations übernimmt und dann z.B. über Events die GUI aktualisiert.

Ich kann dir noch diesen Artikel ans Herz legen:
[FAQ] Wie finde ich den Einstieg in C#?