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
Zweite RS232 Schnittstelle
PlooserX
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

Zweite RS232 Schnittstelle

beantworten | zitieren | melden

Moin,

erstmal großes Lob an das sehr gute Forum, ich konnte mir hier schon viele viele Ideen und Tipps rausziehen.
Meine C# Kenntnisse sind nicht wirklich großartig, 0,5 Jahr Fachhochschule mit eher schwachen Vorlesungen.
Daher muss ich mir vieles immer wieder selber neu erklären.

Nun zum eigtl. Thema:
Ich bin momentan dabei ein Motor mit angeschlossenem Inkremental-Messsystem anzusteuern und auszulesen (sPort).
Zusätzlich gibt es noch ein weiteres Messsystem, Abstandssensor, welches nur ausgelesen wird' (sPort1).

Das Ansteuern und verfahren des Motor funktioniert Problemlos.
Das auslesen des Abstandssensor auch.
Wenn ich jetzt allerdings noch die Daten vom Messsystem am Motor auslesen will, funktioniert fast Garnichts mehr.
Mal gibt's Werte, mal gibt's nur Werte vom Abstandssensor, mal passiert garnichts.

Mein Code ist folgender:


sPort.DataReceived += new SerialDataReceivedEventHandler
(sPort_DataReceived);
sPort1.DataReceived += new SerialDataReceivedEventHandler
(sPort1_DataReceived);

//Motor
private void BtnComMotor_Click(object sender, EventArgs e)
        {
                try
                {
                    sPort.PortName = cmbComMotor.Text;
                    //sPort.PortName = "COM3";
                    sPort.BaudRate = 38400;
                    sPort.Parity = Parity.None;
                    sPort.DataBits = 8;
                    sPort.StopBits = StopBits.One;
                    sPort.Handshake = Handshake.None;

                    //Öffnen der seriellen Schnittstelle
                    sPort.Open();
                }
                catch (Exception)
                {
                    MessageBox.Show("Keine Verbindung möglich.\nBitte wählen Sie einen COM-Port aus!", "COM-Port fehlt");
                }
                if (sPort.IsOpen)
                {
                    BtnDown.Enabled = true;
                    BtnUp.Enabled = true;
                    BtnConPo.Enabled = true;
                    BtnConNeg.Enabled = true;
                    BtnStop.Enabled = true;
                    sPort.Write("PF\r");
                    timer1.Start();
                }
            }
        }
        private void sPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            motordaten = sPort.ReadLine();
            motordaten += Environment.NewLine;
            this.Invoke(new EventHandler(DisplayTextMotor));
        }

        public void DisplayTextMotor(object sender, EventArgs e)
        {
            if (motordaten.Contains("PF="))
            {
                motordatennew = motordaten.Substring(4, 6);
            }
            txtMotordaten.AppendText("" + motordaten+ "\n");
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            sPort.Write("PF\r");
        }

//Abstandssensor
        private void btnComLaser_Click(object sender, EventArgs e)
        {
                try
                {
                    sPort1.PortName = cmbComLaser.Text;
                    //sPort1.PortName = "COM1";
                    sPort1.BaudRate = 9600;
                    sPort1.Parity = Parity.None;
                    sPort1.DataBits = 8;
                    sPort1.StopBits = StopBits.One;
                    sPort1.Handshake = Handshake.None;

                    //Öffnen der seriellen Schnittstelle
                    sPort1.Open();
                }
                catch (Exception)
                {
                    MessageBox.Show("Keine Verbindung möglich.\n
                                                 Bitte wählen Sie einen COM-Port aus!", "COM-Port fehlt");
                }
            }
        }

        private void sPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            aktPosLaser = sPort1.ReadTo("\r");
            aktPosLaser += Environment.NewLine;
            this.Invoke(new EventHandler(DisplayTextSensor));
        }

        public void DisplayTextSensor(object sender, EventArgs e)
        {
            try
            {
                showDataLaser = aktPosLaser.Substring(1, 3);
                showDataLaser2 = aktPosLaser.Substring(4, 1);
                TxtPosLas.AppendText("" + showDataLaser + "." + showDataLaser2 + "mm\n");
            }
            catch (Exception f)
            {
            }
        }

Im Grunde genommen hab ich die Geschichte einfach nur kopiert und ein wenig angepasst um die Daten des Motors auch zu empfangen.

Kann mir vllt jemand sagen wo mein Problem liegt? Wie muss das ganze angepasst werden? Warum funktioniert das nicht?

Vllt. kann ja jemand einem absoluten Anfänger ein wenig auf die Sprünge helfen. Ich wäre euch sehr dankbar. Ich weiß leider nicht mehr weiter. Die Suche und Google habe ich natürlich auch schon ausgiebig bemüht.

Vielen Dank

Plooser
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von PlooserX am .
private Nachricht | Beiträge des Benutzers
GarlandGreene
myCSharp.de - Member



Dabei seit:
Beiträge: 499
Herkunft: Emmerich, NRW

beantworten | zitieren | melden

ein Fehler ganz oben: im DataReceived-Event von sPort1 verwendest du denselben Eventhandler (sPort_DataReceived statt sPort1_DataReceived) wie für sPort. So soll das vermutlich aussehen:


sPort1.DataReceived += new SerialDataReceivedEventHandler
(sPort1_DataReceived);
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von GarlandGreene am .
private Nachricht | Beiträge des Benutzers
PlooserX
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für die schnelle Antwort. Aber daran liegt's leider nicht.
Hab den Fehler beim erstellen gemacht.
Copy+Paste, nur leider eine 1 vergessen.

Sollte das denn prinzipiell so funktionieren?
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo PlooserX,
Zitat
Wenn ich jetzt allerdings noch die Daten vom Messsystem am Motor auslesen will
davon sehe ich im Code nichts. Hast du gerade den Teil, der die Probleme verursacht, unterschlagen?

herbivore
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

Hallo PlooserX,

auf welches Interval ist dein Timer1 eingestellt?
Sendet der Motor die Daten nachdem Du "PF" geschickt hast?

evtl. bringt es was wenn du statt "Invoke" => "BeginInvoke" verwendest... wobei dann kann es passieren dass du einen Wert verpasst...

Im DataReceived solltest die Daten per ReadExisting einlesen, nicht dass nach dem ReadLine immer noch Daten im Puffer stehen...
SerialPort.DataReceived-Ereignis

Grüße
Steffen
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von steffen_dec am .
private Nachricht | Beiträge des Benutzers
PlooserX
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

beantworten | zitieren | melden

Erstmal vielen Dank für die Unterstützung. Bin euch echt dankbar!

@herbivore: Das Messystem läuft mit über die Kommunikation vom Motor, das ist eine große Einheit.

@Steffen_dec: Der Timer1 müsste auf 100 eingestellt sein. War mal 1000 und dann bin ich runter auf 100.

Ich habe vorhin nochmal kurz ein wenig was ausprobiert.


        private void sPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
         {
             motordaten = sPort.ReadLine();
            // geändert zu:
            motordaten = sPort.ReadTo("\r");

             motordaten += Environment.NewLine;
             this.Invoke(new EventHandler(DisplayTextMotor));
           }

Habe eure Antworten leider zu spät gelesen. Und ich komme wahrscheinlich leider auch erst nächste Woche wieder an die Dinge ran.

Meine Änderung war aber schon einmal positiv.
Und zwar bekomme ich nun immer Werte, die auch sauber mitlaufen und sich aktualisieren.
Leider ist das Auslesen vom Abstandssensor sehr sehr langsam geworden.
Der schleicht nur noch hinterher und braucht Ewigkeiten bis er den eigtl Wert der Position erreicht.
private Nachricht | Beiträge des Benutzers