vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Mehrere Befehle über RS232 senden/empfangen 
Autor: Preisser
Datum: 30.06.12 20:07

Hallo,

mir sind auch einige Sachen bei deinem Code aufgefallen.

Du behandelst ja das "DataReceived"-Event des SerialPorts, welches in einem anderen Thread (z.B. aus einem Thread-Pool) aufgerufen werden kann. In dem Ereignishandler jedoch benutzt du dann die Methode ReadTo(String), die wie die anderen Read()-Methoden allerdings blockieren kann (solange, dis die angegebene Zeichenfolge gelesen wurde).

Aber was passiert, wenn zuerst z.B. nur ein einziges Byte ankommt, welches nicht die angegebe Trennungszeichenfolge enthält? In dem Fall würde ja die ReadTo()-Methode blockieren. Wenn danach allerdings weitere Daten ankommen, müsste das DataReceived-Event wieder ausgelöst werden, allerdings würde sich der andere Thread immer noch in dem Eventhandler befinden. Nun könnte es z.B. passieren, dass ein weiterer Thread aus dem Threadpool verwendet wird, um das DataReceived-Event auszulösen, wobei wiederrum die ReadTo()-Methode des SerialPorts aufgerufen wird, was zu Fehlern führen könnte.

Man müsste sich den Quellcode der SerialPort-Klasse genauer ansehen, um nachvollziehen zu können, was in solchen Situationen passieren könnte, weshalb es vermutlich einfacher wäre, es gar nicht erst dazu kommen zu lassen und z.B. einfach einen anderen Thread zu starten, der in einer Schleife die ReadTo-Methode aufruft (so wie es auch in den MSDN-Beispielen zum SerialPort dargestellt ist).

Ein anderer Punkt ist, dass du eine Variable in der Form dazu benutzt, den empfangenen String zu speichern und dann im GUI-Thread wieder auszulesen. Normalerweise aber sollte man die empfangenen Daten im Aufruf der Methode übergeben, denn nur dafür werden sie ja gebraucht. Ansonsten kann es beispielsweise zu Race Conditions kommen, wenn man nicht entsprechend synchronisiert. Hier wird zwar durch die Verwendung von "Invoke" (statt "BeginInvoke") sichergestellt, dass "s" nicht vom Lesethread überschrieben werden kann, solange der GUI-Thread noch mit der Ausführung der "InListeEintragen"-Methode beschäftigt ist; trotzdem sollte man soetwas vermeiden.

Hier ein Beispiel für einen separaten Lesethread:
    Private serialPortReadThread As Thread
 
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
      Handles MyBase.Load
 
        SerialPort1.Open()
 
        'Lesethread starten
        serialPortReadThread = New Thread( _
            Sub()
                ReadSerialPort(SerialPort1)
            End Sub)
        serialPortReadThread.Start()
 
    End Sub
 
    Private Sub ReadSerialPort(sp As SerialPort)
        Try
            Do While True
                Dim s As String = sp.ReadTo(ChrW(13))
                Invoke( _
                    Sub()
                        InListeEintragen(s)
                    End Sub)
 
            Loop
        Catch ex As ThreadInterruptedException
            ' Thread wurde interrupted.
        End Try
    End Sub
 
    Private Sub InListeEintragen(s As String)
 
        ListBox1.Items.Add(s)
        If Not ok Then
            SendZwei(s)
        End If
 
    End Sub
 
 
    Private Sub Form1_FormClosed(sender As System.Object, e As _
      System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        ' Lesethread unterbrechen, sodass er beendet wird
        serialPortReadThread.Interrupt()
    End Sub


Beitrag wurde zuletzt am 30.06.12 um 20:14:03 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Mehrere Befehle über RS232 senden/empfangen5.229Bibobernie29.06.12 11:47
Re: Mehrere Befehle über RS232 senden/empfangen4.108Bibobernie29.06.12 11:50
Re: Mehrere Befehle über RS232 senden/empfangen3.913Bibobernie29.06.12 15:16
Re: Mehrere Befehle über RS232 senden/empfangen3.996Bibobernie30.06.12 17:01
Re: Mehrere Befehle über RS232 senden/empfangen3.929xirton30.06.12 17:10
Re: Mehrere Befehle über RS232 senden/empfangen4.021Bibobernie30.06.12 17:58
Re: Mehrere Befehle über RS232 senden/empfangen4.061xirton30.06.12 18:10
Re: Mehrere Befehle über RS232 senden/empfangen3.960Preisser30.06.12 20:07
Re: Mehrere Befehle über RS232 senden/empfangen3.936xirton30.06.12 20:15
Re: Mehrere Befehle über RS232 senden/empfangen4.039Bibobernie01.07.12 13:49
Re: Mehrere Befehle über RS232 senden/empfangen3.906Bibobernie06.07.12 14:45
Re: Mehrere Befehle über RS232 senden/empfangen3.868xirton06.07.12 15:31
Re: Mehrere Befehle über RS232 senden/empfangen3.998Bibobernie06.07.12 16:41
Re: Mehrere Befehle über RS232 senden/empfangen3.905xirton06.07.12 16:54
Re: Mehrere Befehle über RS232 senden/empfangen3.993Preisser06.07.12 17:12
Re: Mehrere Befehle über RS232 senden/empfangen3.834xirton06.07.12 17:14
Re: Mehrere Befehle über RS232 senden/empfangen3.881Preisser06.07.12 17:00
Re: Mehrere Befehle über RS232 senden/empfangen3.905Bibobernie06.07.12 20:59
Re: Mehrere Befehle über RS232 senden/empfangen3.973Bibobernie08.07.12 00:01
Re: Mehrere Befehle über RS232 senden/empfangen4.057Preisser08.07.12 03:20
Re: Mehrere Befehle über RS232 senden/empfangen3.974Bibobernie08.07.12 10:29
Re: Mehrere Befehle über RS232 senden/empfangen3.890Preisser08.07.12 14:06
Re: Mehrere Befehle über RS232 senden/empfangen3.896Bibobernie09.07.12 22:08

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel