4 Stimmen

Kommunikation über die serielle Schnittstelle in .NET

Ich verwende C#, um Daten von einer seriellen Schnittstelle zu empfangen, aber es gibt einige Probleme. Ich bin neu in diesem Bereich, also brauche ich etwas Hilfe.

  1. Zunächst einmal möchte ich wissen, welche Funktionen ereignisgesteuert sind:

    ReadExisting()
    Read()
    Readbyte() 
    Readchar()
    ReadLine()
    Readto()
  2. Wie kann ich die erforderlichen Daten aus dem Eingangsstrom dieses Anschlusses übernehmen?

    Ich habe Protokolle in statischer Größe. Kann ich ein spezielles Zeichen verwenden, um die Grenzen der Protokolldaten anzugeben, und welches Zeichen ist dafür geeignet?

  3. Wie gehe ich mit dieser Ausnahme um?

    C# SerialPort System.ObjectDisposedException, sicherer Handle wurde in System.DLL geschlossen

8voto

Hans Passant Punkte 894572

Keine dieser Methoden ist "ereignisgesteuert", Sie würden sie im Ereignis DataReceived verwenden. Dieses wird aufgerufen, wenn an der seriellen Schnittstelle mindestens ein Byte an Daten zum Lesen verfügbar ist.

Ich bin nicht sicher, was "statische Größe" bedeutet. Wenn das Gerät eine feste Anzahl von Bytes sendet, würden Sie die Read()-Methode verwenden, um sie zu lesen. Achten Sie auf den Rückgabewert, Sie werden nur so viele Bytes erhalten, wie verfügbar sind. Speichern Sie sie in einem Byte[] und fügen Sie sie im nächsten DR-Ereignis hinzu, bis Sie alle erhalten haben.

Wenn das Gerät keine Bytes, sondern Zeichen sendet, können Sie in der Regel die Eigenschaft NewLine nutzen. Setzen Sie sie auf das Zeichen oder die Zeichenkette, die die Antwort abschließt. Ein Zeilenvorschub (" \n ") ist bei weitem die häufigste Wahl. Lesen Sie die Antwort mit ReadLine(). In diesem Fall ist keine Pufferung erforderlich.

Sie erhalten die Ausnahme ObjectDisposed, wenn Sie ein Formular schließen, aber nicht sicherstellen, dass das Gerät keine Daten mehr sendet. Stellen Sie sicher, dass Sie im Ereignis DataReceived nur BeginInvoke und nicht Invoke verwenden. Und rufen Sie BeginInvoke nicht auf, wenn die Eigenschaft IsDisposed des Formulars wahr ist.

8voto

Andy Punkte 5098

Ich kann der Antwort von Hans nicht viel hinzufügen, außer zu sagen, dass eine der größten Fallen, die ich gesehen habe, darin besteht, dass die Leute dazu neigen, zu erwarten, dass alle Bytes, die sie empfangen möchten, vorhanden sind, wenn das Ereignis DataReceived ausgelöst wird.

Wenn Ihr Nachrichtenprotokoll z. B. 20 Bytes lang ist, wird das Ereignis DataReceived ausgelöst und Sie versuchen, 20 Bytes zu lesen. Vielleicht sind sie alle da, vielleicht auch nicht. Es ist ziemlich wahrscheinlich, dass sie nicht da sind, je nach Baudrate.

Sie müssen die Eigenschaft BytesToRead des Anschlusses, von dem Sie lesen, überprüfen und diese Menge in Ihren Puffer lesen. Wenn mehr Bytes verfügbar sind, wird das Ereignis "DataReceived" erneut ausgelöst.

Beachten Sie, dass das Ereignis DataReceived ausgelöst wird, wenn die Anzahl der zu empfangenden Bytes mindestens der Eigenschaft ReceivedBytesThreshold des seriellen Anschlusses entspricht. Standardmäßig ist dieser Wert wohl auf 1 gesetzt.

Wenn Sie diesen Wert z. B. auf 10 setzen, wird das Ereignis ausgelöst, wenn 10 oder mehr Bytes auf den Empfang warten, aber nicht weniger. Dies kann zu Problemen führen oder auch nicht, und ich persönlich bevorzuge es, diesen Eigenschaftswert auf 1 gesetzt zu lassen, so dass alle empfangenen Daten das Ereignis auslösen, auch wenn nur 1 Byte empfangen wird.

Machen Sie nicht den Fehler, dass dies dazu führt, dass das Ereignis für jedes einzelne empfangene Byte ausgelöst wird - das ist nicht der Fall.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X