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