Das ists eigentlich auch schon ^^ Aus irgend einem Grund "verliere" ich zu Beginn des Strings - den ich vom Port lese - Zeichen (wenn ich richtig gezählt habe, genau 5).
normalerweise schicke ich eine Anfrage mit
public void Send_IdRequest()
{
try
{
this.serialPort.WriteTimeout=200;
this.serialPort.Write("IDN?\r");
}
catch (Exception ex)
{
//absichtlich leer
}
}
Danach lese ich die Daten vom Port aus, die nach dieser Anfrage auf mich warten sollten
public string ReadLine()
{
try
{
this.data = String.Empty;
Thread.Sleep(500);
this.serialPort.ReadTimeout = 1000;
this.data = this.serialPort.ReadTo("\r");
}
catch (Exception ex)
{
}
return this.data;
}
Dazu hab ich noch einen Eventhandler, da die Klasse von zwei verschiedene Geräten benutzt wird (die eine Verbindet sich auf den Handler, die andere nicht). Ich möchte das nicht unbedingt über den Event machen (des gibt wieder andere Probleme wie ich gemerkt habe). Wäre mir lieber, bei dem Gerät nur nach Anfrage zu lesen.
Jemand eine Idee, wo und warum die Zeichen verschwinden? Beim Debuggen sind sie manchmal da, manchmal auch nicht (könnte mal wieder eine Timingsache sein).
Vielen Dank
Hallo,
änder mal Deinen Code von ReadLine() in diesen:
//this.data = String.Empty; Im Konstruktor initialisieren
Thread.Sleep(500);
this.serialPort.ReadTimeout = 1000;
this.data += this.serialPort.ReadTo("\r");
Nimm mal das Sleep und das Setzen des ReadTimeOuts raus. Letzteres nur einmal direkt nach Öffnen. Dann besser nicht mit dem Debugger anschauen, mache Trace-Ausgaben.
Und bist du sicher, dass die gleiche Schnittstelle nicht vielleicht auch über den Handler bedient wird? Nicht, dass sich hier zwei Threads die Daten teilen müssen.
Danke euch beiden, ihr kennt euch ja richtig gut aus mit dem Zeug (für mich is das Steinzeit und ich hab noch nie wirklich viel mit gearbeitet).
Vielen Dank erstmal!
edit: Also ich hab mal eure Vorschläge ausprobiert und bin zu folgendem Ergebnis einstweilen gekommen:
Der EventHandler pfuscht mir anscheinend in meine normalen Anfragen rein. Darum hab ich meine eine Klasse in zwei geteilt (eine hat nur den Event und Delegaten, die andere macht direkte Anfragen).
Jetzt gehts auch. Ist zwar nicht elegant, aber muss für die Vorführung und Abnahme reichen 😉
Also Steinzeit ist das niemals, serielle Schnittstelle ist nach wie vor in vielen Bereichen ein brand aktuelles Thema.
2.
Mal hiermit probiert:
?
Hallo JoeTempes
Das diese Schnittstellen immer noch aktuell sind habe ich mittlerweilen ja auch erfahren dürfen 🙂 hat mich aber auch nicht wirklich verwundert. Allerdings sind sie bei heimischen PCs für den Anwender praktisch verschwunden, dasm einte ich damit.
Dein Template habe ich ausprobiert und mich sogar daran orientiert. Vielen Dank dafür, hat mir sehr geholfen als ich mit C# angefangen habe letztes Jahr. Waren viele nützliche Sachen für mich dabei. Echt gut gemacht.