Laden...

Serialport: Woran kann es liegen dass Zeichen am Anfang fehlen?

Erstellt von smilingbandit vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.613 Views
S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 16 Jahren
Serialport: Woran kann es liegen dass Zeichen am Anfang fehlen?

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

888 Beiträge seit 2007
vor 16 Jahren

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

S
8.746 Beiträge seit 2005
vor 16 Jahren

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.

S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 16 Jahren

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 😉

888 Beiträge seit 2007
vor 16 Jahren

Also Steinzeit ist das niemals, serielle Schnittstelle ist nach wie vor in vielen Bereichen ein brand aktuelles Thema.

2.
Mal hiermit probiert:

Template SerialPort

?

S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 16 Jahren

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.