Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Senden über SerialPort funktioniert nur nach ButtonClick, nicht nach Methodenaufruf
wlfmario
myCSharp.de - Member



Dabei seit:
Beiträge: 12
Herkunft: Dormagen

Themenstarter:

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

beantworten | zitieren | melden

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));
        }
...
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 878
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Probiere mal, ob Dir ein serialPort1.Flush() nach dem WriteLine() hilft.
private Nachricht | Beiträge des Benutzers
123thomas
myCSharp.de - Member



Dabei seit:
Beiträge: 125

beantworten | zitieren | melden

Hallo,

was wird den in "Verbunden();" ausgeführt?
private Nachricht | Beiträge des Benutzers
wlfmario
myCSharp.de - Member



Dabei seit:
Beiträge: 12
Herkunft: Dormagen

Themenstarter:

beantworten | zitieren | melden

In Verbunden() werde nur Buttons Aktiviert oder Deaktiviert!
serial1.Flush(); gibt es leider bei mir nicht bzw. kennt es nicht.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4177

beantworten | zitieren | melden


serial1.BaseStream.Flush();
private Nachricht | Beiträge des Benutzers
wlfmario
myCSharp.de - Member



Dabei seit:
Beiträge: 12
Herkunft: Dormagen

Themenstarter:

beantworten | zitieren | melden

Leider bringt das Flush auch nichts.
Nur wie schon geschrieben im Click Ereignis eines Buttons oder ähnlich funktioniert es !
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
MartinH
myCSharp.de - Member

Avatar #avatar-1761.gif


Dabei seit:
Beiträge: 183
Herkunft: Asperg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2137

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
wlfmario
myCSharp.de - Member



Dabei seit:
Beiträge: 12
Herkunft: Dormagen

Themenstarter:

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2137

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
wlfmario
myCSharp.de - Member



Dabei seit:
Beiträge: 12
Herkunft: Dormagen

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

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

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers