vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 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 - Fortgeschrittene
SerialPort -- Puffer löschen klappt nicht so wie gewünscht 
Autor: DomiS
Datum: 16.01.06 10:08

Hallo,
weiter unten könnt ihr einen Code-Ausschnitt zum Thema der neuen .NET 2.0 Klasse System.IO.Ports sehen. Ich benutze dort einen SerialPort und Frage in der Main in einer Endlosschleife den Event ab, ob Daten am seriellen Port bereitstehen.
Das klappt auch soweit ganz gut, mit den Sleeps bekomme ich genau die Abstände, dass bei mir alles in richtigen Bahnen verläuft.

Mein Problem ist jedoch folgendes:
Da die Daten gepuffert werden und mein serieller RFID-Reader konstant Daten übermittelt, sobald sich ein RFID-Chip im Empfangsbereich befindet, muss ich den Puffer jedesmal löschen. Wenn ich dann die anstehenden Bytes abfrage, dann bekomme ich 0 zurückgeliefert, also ist der Puffer auch wirklich leer!
Allerdings springt der Event bei mir trotzdem immer ein zweites Mal an. Den Grund dafür kenne ich leider nicht. Im Endeffekt bekomme ich also 2 mal die Methode port_DataReceived ausgeführt, obwohl ich sie ja nur einmal ausgeführt haben will und dafür ja extra den Puffer leeren lasse!
Deswegen habe ich die bool-Variable zweiterversuch eingeführt. Sollte diese True sein, also ein zweiter Durchlauf der Methode vorliegen, so soll die Sub-Methode abgebrochen werden. Allerdings lande ich bei diesem harten Vorgehen dann wieder in der Main mit der Endlosschleife und auf den Event, dass serielle Daten anstehen, wird überhaupt nichtmehr reagiert. Das ist natürlich NICHT in meinem Sinne, ich wollte ja blos den ominösen 2. Durchlauf verhindern!

Vielleicht hat ja jemand von Euch eine Idee, danke!


Imports System.IO.Ports
 
Module Module1
 
 
    Public Delegate Sub SerialDataReceivedEventHandler(ByVal sender As Object, _
      ByVal e As SerialDataReceivedEventArgs)
    Public Event DataReceived As SerialDataReceivedEventHandler
 
    Dim port As New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)
    Dim zweitversuch As Boolean = False
 
 
    Sub Main()
 
        ' Handler anlegen und registrieren
        Dim handler As System.IO.Ports.SerialDataReceivedEventHandler = _
          AddressOf port_DataReceived
        AddHandler port.DataReceived, handler
 
        ' Endlos-Schleife starten, Event wird ggf. aktiv und verarbeitet die ID 
        ' weiter
        port.Open()
        While (True)
            Threading.Thread.Sleep(100)
            Console.WriteLine("Main!")
        End While
        port.Close()
 
    End Sub
 
 
    Sub port_DataReceived(ByVal sender As Object, ByVal e As _
      SerialDataReceivedEventArgs)
 
        ' die zweite Ausgabe verhindern
        If zweitversuch Then Exit Sub
 
        ' Array von 0 bis 12, also mit 13 Stellen
        Dim ausgabe As Char() = New Char(12) {}
        Dim id As Char() = New Char(9) {}
 
        ' 25ms warten, um (zumindest auf diesem Rechner) die gewünschte 13Byte 
        ' Übertragung zu erreichen!
        ' 13Byte über eine 9600bit/s Leitung brauchen eben seine Zeit!
        Threading.Thread.Sleep(25)
 
        ' Daten am COM-Port lesen
        Console.WriteLine("Getting Data")
        port.Read(ausgabe, 0, 13)
 
        ' (Steuer-)Zeichen Nummer 1,2 und 13 abschneiden (index 0,1 und 12 aus 
        ' dem Array)
        For i As Integer = 2 To ausgabe.Length - 2
            id(i - 2) = ausgabe(i)
        Next
 
        ' Ausgabe der 10-stelligen ID
        Console.WriteLine("Ausgabe: ")
        Console.WriteLine(id)
 
        ' übermittelte ID weiterverarbeiten, also in der DB checken usw. ( 
        ' momentan deaktiviert, erstmal soll der Rest funktionieren, bevor ID 
        ' weiterverarbeitet wird!)
        'id_check(id)
 
        ' InBuffer löschen + Wartezeit, so dass nicht immerzu der Event 
        ' anspringt
        port.DiscardInBuffer()
        Console.WriteLine("BytesToRead: " & port.BytesToRead)
        Threading.Thread.Sleep(5000)
 
        ' zweiter Versuch signalisieren
        If zweitversuch Then
            zweitversuch = False
        Else
            zweitversuch = True
        End If
 
    End Sub
End Module
Die Ausgabe auf der Konsole schaut dann wie folgt aus:

Main!
Main!
Main!
Main!
Getting Data
Ausgabe:
21D9A4A02E
BytesToRead: 0
Main!
Main!
Main!
Main!

Allerdings springt er ab diesem Zeitpunkt jetzt NIE mehr in die Event-Methode, mein Programm verharrt also in der Main und ist damit nutzlos.
Wenn ich diese Sache mit dem 2. Versuch weglassen, dann schaut die Ausgabe so aus, dass die Sachen doppelt ausgegeben werden, also so:


Main!
Main!
Getting Data
Ausgabe:
21D9A4A02E
BytesToRead: 0
Getting Data
Ausgabe:
21D9A4A02E
BytesToRead: 0
Main!
Main!
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
SerialPort -- Puffer löschen klappt nicht so wie gewünscht4.916DomiS16.01.06 10:08
Re: SerialPort -- Puffer löschen klappt nicht so wie gewünsc...4.355DomiS16.01.06 10:21
Re: SerialPort -- Puffer löschen klappt nicht so wie gewünsc...4.603bqstony16.01.06 13:30
Re: SerialPort -- Puffer löschen klappt nicht so wie gewünsc...4.426DomiS17.01.06 10:44

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