Laden...

Senden über SerialPort funktioniert nur nach ButtonClick, nicht nach Methodenaufruf

Erstellt von wlfmario vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.497 Views
W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 5 Jahren
Senden über SerialPort funktioniert nur nach ButtonClick, nicht nach Methodenaufruf

Hallo zusammen,
ich beschäftige mich erst seit kurzem mit C# und etwas Java daher nicht gleich schimpfen wenn ich evtl. den falschen Suchbegriff verwendet habe. 😉

Jetzt aber zu meinen kleinen Problemchen !
Ich habe mich etwas mit dem SerialPort beschäftigt und eine kleine Übungsanwendung in der MFC
Umgebung geschrieben.
Wenn ich jetzt etwas über den SerialPort senden möchte, habe ich das meist über Buttons ect. gemacht, was bis jetzt auch immer gut Funktioniert hat.
Nur wenn ich aus dem Programm heraus bsp. einer Funktion etwas senden möchte, bekomme ich werder eine Fehlermeldung noch wird mir das Ergebnis angezeigt.
Es geht genauer um die Zeile "serialPort1.WriteLine("$$");" im Code die nach dem Absenden Einstellungen zurück gibt.
Wenn ich diese in ein Click-Ereignis packe, funktioniert es.
Kann mir jemand erklären warum dies nicht Funktioniert ?
Danke schon Einmal für eure Antworten.


...
 try
                {
                    serialPort1.BaudRate = Convert.ToInt32(ComboBoxBaud.Text);
                    serialPort1.PortName = ComboBoxPort.Text;
                    serialPort1.Parity = Parity.None;
                    serialPort1.StopBits = StopBits.One;
                    serialPort1.DataBits = 8;
                    serialPort1.Handshake = Handshake.None;
                    serialPort1.RtsEnable = true;
                    serialPort1.DtrEnable = true;
                    serialPort1.ReadTimeout = 500;
                    serialPort1.WriteTimeout = 500;
                    serialPort1.Open();
                }
                catch (Exception e) { MessageBox.Show("Fehler !\n" + e.Message, "Verbindungs Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error); }

                if (serialPort1.IsOpen)
                {
                    Verbunden();
                        serialPort1.WriteLine("$$");
                }
            }

        }

        private String rxstring;
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            rxstring = serialPort1.ReadExisting();
            Invoke(new EventHandler(DisplayTxt));
        }
...

W
872 Beiträge seit 2005
vor 5 Jahren

Probiere mal, ob Dir ein serialPort1.Flush() nach dem WriteLine() hilft.

1
124 Beiträge seit 2012
vor 5 Jahren

Hallo,

was wird den in "Verbunden();" ausgeführt?

W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 5 Jahren

In Verbunden() werde nur Buttons Aktiviert oder Deaktiviert!
serial1.Flush(); gibt es leider bei mir nicht bzw. kennt es nicht.

W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 5 Jahren

Leider bringt das Flush auch nichts.
Nur wie schon geschrieben im Click Ereignis eines Buttons oder ähnlich funktioniert es !

16.806 Beiträge seit 2008
vor 5 Jahren

Die Beschreibung macht nur so alleinstehend wenig sinn, weil ein UI Event nichts mit dem SerialPort zutun haben kann.
Wenn dann ist es ein Seiteneffekt aufgrund eines Programmierfehlers, den wir hier nicht erkennen können, weil wir nur den kleinen Schnipsel Code haben.

185 Beiträge seit 2005
vor 5 Jahren

Hast du mal einen Breakpoint gesetzt, ob dein WriteLine überhaupt aufgerufen wird?

Eventuell ist der Port noch nicht offen und serialport1.IsOpen gibt noch false zurück.

C
2.121 Beiträge seit 2010
vor 5 Jahren

Was genau funktioniert da nicht?
Kriegst du keine Antwort im Receive Ereignis oder bist du sicher dass 1. die Zeile ausgeführt wird und 2. nichts beim Empfänger ankommt?

W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 5 Jahren

Ich habe jetzt noch einmal getestet und bemerkt das dass

serialPort1.WriteLine("$$");

noch vor den starten der Gbrl Software auf dem Adruino gesendet wird.
Daher denke ich mal kommt auch weiter keine Antwort vom Adruino.
Ich müsste testen ob die Software auf dem Adruino gestartet ist oder ob die Seriale Schnittstelle fertig ist nach dem ersten Lesen der Daten.

Wie kann man dies am besten bewerkstelligen ?
Wenn der Adruino gestartet ist, erscheint in in einer ComoBox der Text "Gbrl usw." ob es Ratsam ist nach dem Text zu suchen und dann serialPort1.WriteLine("$$"); aufzurufen oder wie könnte ich dies abfragen ?

C
2.121 Beiträge seit 2010
vor 5 Jahren

Wer ändert die Combobox? Dort kannst du dir merken dass der Arduino jetzt bereit ist.
Irgendwelche Texte von GUI Elementen solltest du nicht als Statusinformation hernehmen. Irgendwann änderst du den Text ab und dein ganzes Programm macht nur noch Fehler.

W
wlfmario Themenstarter:in
12 Beiträge seit 2018
vor 5 Jahren

Mit


private void DisplayTxt(object sender, EventArgs e)
        {
            RichTextBoxOutput.AppendText(rxstring);
            RichTextBoxOutput.ScrollToCaret();
        }

private String rxstring;
        private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            rxstring = serialPort1.ReadExisting();
            Invoke(new EventHandler(DisplayTxt));
        }

schreibe ich ich die empfangenden Daten in eine RichTextBox.
Nach dem Start vom Adruino (Reset) gibt die CNC Firmware einen Text aus in etwa** "Gbrl V1.x ['$' for Help]"**
Diesen Text könnte ich zwar Filtern allerdings wenn dieser mal geändert wird, macht das Programm eben nur Mist.
Daher meine Frage ob man das irgenwie intelligenter abfragen könnte.

16.806 Beiträge seit 2008
vor 5 Jahren

Wenn es keinen ordentlichen Handshake gibt, dann hast Du keine andere Möglichkeit der automatischen Erkennung.
Übliches Problem beim SerialPort.