Laden...

System.IO.Ports.SerialPort DataReceived öfter als erwartet?!

Erstellt von Marcel vor 15 Jahren Letzter Beitrag vor 5 Jahren 9.421 Views
M
Marcel Themenstarter:in
210 Beiträge seit 2005
vor 15 Jahren
System.IO.Ports.SerialPort DataReceived öfter als erwartet?!

Hallo

ich versuche mich gerade an eine seriellen Schnittstelle.
Dazu verwende ich die Klasse System.IO.Ports.SerialPort aus .NET 2.0
Ich habe an meinen 9poligen Anschluss einen Loopbackstecker angeschlossen
und bekomme somit alle ausgesendeten Signal wieder als Eingangssignale zurück.

Soweit funktioniert das alles auch.
Das Prinzip:

SerialPort.write(text) schreibt text (Ausgang)
SerialPort.DataReceived-Event (Eingang)

Wenn ich nun einen etwqs längeren text sende, dann bekomme ich mehrere DataReceived Events?! Ist das normal? Kann man ein Event erzwingen?

Beispiel 1:
Write("Hallo Welt");
Data Received(): Hallo Welt! // 11 Zeichen gelsesen

Beispiel 2:
Write("Hallo Welt, ich schreibe dir einen etwas laengeren Text");
Data Received(): Hallo Welt, // 11 Zeichen gelsesen
Data Received(): ** ich schreibe dir eine ** // 22 Zeichen gelsesen
Data Received(): **n etwas laengeren Tex ** // 21 Zeichen gelsesen
Data Received(): **t ** // 1 Zeichen gelsesen

Hier mal ein parr Codezeilen:

public SerialConnector()
        {
            COM = new SerialPort();
            if (!init())
            {
                System.Diagnostics.Debug.WriteLine("Fehler beim Öffnen des Ports!");

            }
        }

        private bool init()
        {
            // Initialize the COM Settings
            COM.BaudRate  = 9600;
            COM.PortName  = "COM2";
            COM.DataBits  = 8;
            COM.RtsEnable = false;
            COM.Handshake = System.IO.Ports.Handshake.None;
            COM.ReceivedBytesThreshold = 1;
            COM.StopBits  = System.IO.Ports.StopBits.One;
            COM.Parity    = System.IO.Ports.Parity.None;
            COM.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
            COM.ErrorReceived += new SerialErrorReceivedEventHandler(ErrorReceived);
            try
            { COM.Open(); }
            catch
            { return false; }
            return true;
        }
public bool write(string data)
        {
            if (COM != null)
            {
                if (COM.IsOpen)
                {
                    COM.Write(data);
                    return true;
                }
            }
            return false;
        }
void DataReceived(object sender, SerialDataReceivedEventArgs e)
        {            
            SerialPort localPort = (SerialPort)sender;
            int length = localPort.BytesToRead;
            char[] buffer = new char[length];
            int count = localPort.Read(buffer, 0, length);
            string text = new String(buffer);
            System.Diagnostics.Debug.WriteLine("Data Received(): "+text+" ["+count+"]");
            
        }

Hat jemand eine Idee? Oder vielleicht ein Code Snippet wie man es anders oder besser machen kann?!

Danke in voraus für jeden Tipp!

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo Marcel,

das ist bei den Seriellen Ports so, dass er intern einen Buffer verwendet, den er asynchron abarbeitet. Das kann man meiner Meinung nach nicht umgehen.

Deshalb muss Deine Kommunikation auf eine Art Protokoll aufbauen. Z.B. SendeMirText bestimmt, dass am Schluß des Textes ein Sonderzeichen mitgeschickt wird, so dass der Empfänger immer weiß, jetzt ist die Sendung komplett.

Oder Du gibst die Länge vor jeder Sendung mit an (z.B. 30 Zeichen).

Ansonsten ist das Senden / Empfangen jederzeit und immer über den Hardwarebuffer möglich (eine fließende Kommunikation).

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

M
Marcel Themenstarter:in
210 Beiträge seit 2005
vor 15 Jahren

Hi und danke für die Antwort schonmal vorweg.

Ich hatte soetwas befürchtet 😦
Zumindest die Struktur der Daten sieht immer gleich aus,
so dass ich sagen kann, wann der Beginn einer Nachricht ist.
Vermutlich ist auch die Anzahl der Zeichen immer konstant.

Die Nachricht schaut immer so aus:

CONTROL 15/05/2008 10:53:55 OK
004672.3 005082.6 004490.0 OK
004786.6 005203.3 004793.3 OK
004507.9 004909.1 004401.0 OK
004642.3 005051.0 004729.7 OK
018609.1 019427.6 018414.1 OK

Die Werte selbst ändern sich natürlich, aber die Struktur bleibt gleich.
Ist es denn durchaus üblich, dass man sagt: X Zeichen ist die Nachrictenlänge?
Oder Jede nachricht beginnt mit "CONTROL"?! Goibt es vielleicht ein Beispiel
an dem ich mich orientieren kann?

Gruz

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo Marcel,

das hängt ganz allein von dem Gerät ab, was angeschlossen ist. Da gibt es keine Vorgabe.

Bist Du sicher, dass immer die gleiche Zeichenlänge herauskommt, was passiert wenn etwas nicht OK ist (was steht dann am Ende einer Zeile? Oder eventuell bedeutet OK der Abschluß einer Datenzeile?

Das musst Du mit dem Gerätehersteller klären, eine andere Möglichkeit gibt es normalerweise nicht. Was für ein Gerät ist es denn (manche unterliegen einem Standard, z.B. Modems)?

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

185 Beiträge seit 2005
vor 15 Jahren

sendet das Gerät kein CR/LF nach einer Datenzeile? Daran kannst du dann ja das Ende erkennen und die Nachricht dann zusammensetzen.

J
38 Beiträge seit 2015
vor 5 Jahren

Nabend,
Konntest du das Problem lösen?