Laden...

Zweite RS232 Schnittstelle

Erstellt von PlooserX vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.693 Views
P
PlooserX Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren
Zweite RS232 Schnittstelle

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

G
497 Beiträge seit 2006
vor 11 Jahren

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);

P
PlooserX Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

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?

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo PlooserX,

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

S
322 Beiträge seit 2007
vor 11 Jahren

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

P
PlooserX Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

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.